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#include "libavutil/loongarch/cpu.h" 24cabdff1aSopenharmony_ci#include "hevcdsp_lsx.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_civoid ff_hevc_dsp_init_loongarch(HEVCDSPContext *c, const int bit_depth) 27cabdff1aSopenharmony_ci{ 28cabdff1aSopenharmony_ci int cpu_flags = av_get_cpu_flags(); 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci if (have_lsx(cpu_flags)) { 31cabdff1aSopenharmony_ci if (bit_depth == 8) { 32cabdff1aSopenharmony_ci c->put_hevc_qpel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_lsx; 33cabdff1aSopenharmony_ci c->put_hevc_qpel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_lsx; 34cabdff1aSopenharmony_ci c->put_hevc_qpel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_lsx; 35cabdff1aSopenharmony_ci c->put_hevc_qpel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_lsx; 36cabdff1aSopenharmony_ci c->put_hevc_qpel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_lsx; 37cabdff1aSopenharmony_ci c->put_hevc_qpel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_lsx; 38cabdff1aSopenharmony_ci c->put_hevc_qpel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_lsx; 39cabdff1aSopenharmony_ci c->put_hevc_qpel[8][0][0] = ff_hevc_put_hevc_pel_pixels48_8_lsx; 40cabdff1aSopenharmony_ci c->put_hevc_qpel[9][0][0] = ff_hevc_put_hevc_pel_pixels64_8_lsx; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci c->put_hevc_epel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_lsx; 43cabdff1aSopenharmony_ci c->put_hevc_epel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_lsx; 44cabdff1aSopenharmony_ci c->put_hevc_epel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_lsx; 45cabdff1aSopenharmony_ci c->put_hevc_epel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_lsx; 46cabdff1aSopenharmony_ci c->put_hevc_epel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_lsx; 47cabdff1aSopenharmony_ci c->put_hevc_epel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_lsx; 48cabdff1aSopenharmony_ci c->put_hevc_epel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_lsx; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci c->put_hevc_qpel[1][0][1] = ff_hevc_put_hevc_qpel_h4_8_lsx; 51cabdff1aSopenharmony_ci c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_lsx; 52cabdff1aSopenharmony_ci c->put_hevc_qpel[4][0][1] = ff_hevc_put_hevc_qpel_h12_8_lsx; 53cabdff1aSopenharmony_ci c->put_hevc_qpel[5][0][1] = ff_hevc_put_hevc_qpel_h16_8_lsx; 54cabdff1aSopenharmony_ci c->put_hevc_qpel[6][0][1] = ff_hevc_put_hevc_qpel_h24_8_lsx; 55cabdff1aSopenharmony_ci c->put_hevc_qpel[7][0][1] = ff_hevc_put_hevc_qpel_h32_8_lsx; 56cabdff1aSopenharmony_ci c->put_hevc_qpel[8][0][1] = ff_hevc_put_hevc_qpel_h48_8_lsx; 57cabdff1aSopenharmony_ci c->put_hevc_qpel[9][0][1] = ff_hevc_put_hevc_qpel_h64_8_lsx; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci c->put_hevc_qpel[1][1][0] = ff_hevc_put_hevc_qpel_v4_8_lsx; 60cabdff1aSopenharmony_ci c->put_hevc_qpel[3][1][0] = ff_hevc_put_hevc_qpel_v8_8_lsx; 61cabdff1aSopenharmony_ci c->put_hevc_qpel[4][1][0] = ff_hevc_put_hevc_qpel_v12_8_lsx; 62cabdff1aSopenharmony_ci c->put_hevc_qpel[5][1][0] = ff_hevc_put_hevc_qpel_v16_8_lsx; 63cabdff1aSopenharmony_ci c->put_hevc_qpel[6][1][0] = ff_hevc_put_hevc_qpel_v24_8_lsx; 64cabdff1aSopenharmony_ci c->put_hevc_qpel[7][1][0] = ff_hevc_put_hevc_qpel_v32_8_lsx; 65cabdff1aSopenharmony_ci c->put_hevc_qpel[8][1][0] = ff_hevc_put_hevc_qpel_v48_8_lsx; 66cabdff1aSopenharmony_ci c->put_hevc_qpel[9][1][0] = ff_hevc_put_hevc_qpel_v64_8_lsx; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci c->put_hevc_qpel[1][1][1] = ff_hevc_put_hevc_qpel_hv4_8_lsx; 69cabdff1aSopenharmony_ci c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_lsx; 70cabdff1aSopenharmony_ci c->put_hevc_qpel[4][1][1] = ff_hevc_put_hevc_qpel_hv12_8_lsx; 71cabdff1aSopenharmony_ci c->put_hevc_qpel[5][1][1] = ff_hevc_put_hevc_qpel_hv16_8_lsx; 72cabdff1aSopenharmony_ci c->put_hevc_qpel[6][1][1] = ff_hevc_put_hevc_qpel_hv24_8_lsx; 73cabdff1aSopenharmony_ci c->put_hevc_qpel[7][1][1] = ff_hevc_put_hevc_qpel_hv32_8_lsx; 74cabdff1aSopenharmony_ci c->put_hevc_qpel[8][1][1] = ff_hevc_put_hevc_qpel_hv48_8_lsx; 75cabdff1aSopenharmony_ci c->put_hevc_qpel[9][1][1] = ff_hevc_put_hevc_qpel_hv64_8_lsx; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci c->put_hevc_epel[7][0][1] = ff_hevc_put_hevc_epel_h32_8_lsx; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci c->put_hevc_epel[5][1][0] = ff_hevc_put_hevc_epel_v16_8_lsx; 80cabdff1aSopenharmony_ci c->put_hevc_epel[6][1][0] = ff_hevc_put_hevc_epel_v24_8_lsx; 81cabdff1aSopenharmony_ci c->put_hevc_epel[7][1][0] = ff_hevc_put_hevc_epel_v32_8_lsx; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci c->put_hevc_epel[3][1][1] = ff_hevc_put_hevc_epel_hv8_8_lsx; 84cabdff1aSopenharmony_ci c->put_hevc_epel[4][1][1] = ff_hevc_put_hevc_epel_hv12_8_lsx; 85cabdff1aSopenharmony_ci c->put_hevc_epel[5][1][1] = ff_hevc_put_hevc_epel_hv16_8_lsx; 86cabdff1aSopenharmony_ci c->put_hevc_epel[6][1][1] = ff_hevc_put_hevc_epel_hv24_8_lsx; 87cabdff1aSopenharmony_ci c->put_hevc_epel[7][1][1] = ff_hevc_put_hevc_epel_hv32_8_lsx; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_lsx; 90cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_lsx; 91cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_lsx; 92cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_lsx; 93cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_lsx; 94cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_lsx; 95cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[8][0][0] = ff_hevc_put_hevc_bi_pel_pixels48_8_lsx; 96cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[9][0][0] = ff_hevc_put_hevc_bi_pel_pixels64_8_lsx; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci c->put_hevc_epel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_lsx; 99cabdff1aSopenharmony_ci c->put_hevc_epel_bi[2][0][0] = ff_hevc_put_hevc_bi_pel_pixels6_8_lsx; 100cabdff1aSopenharmony_ci c->put_hevc_epel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_lsx; 101cabdff1aSopenharmony_ci c->put_hevc_epel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_lsx; 102cabdff1aSopenharmony_ci c->put_hevc_epel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_lsx; 103cabdff1aSopenharmony_ci c->put_hevc_epel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_lsx; 104cabdff1aSopenharmony_ci c->put_hevc_epel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_lsx; 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[3][1][0] = ff_hevc_put_hevc_bi_qpel_v8_8_lsx; 107cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[5][1][0] = ff_hevc_put_hevc_bi_qpel_v16_8_lsx; 108cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[6][1][0] = ff_hevc_put_hevc_bi_qpel_v24_8_lsx; 109cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[7][1][0] = ff_hevc_put_hevc_bi_qpel_v32_8_lsx; 110cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[8][1][0] = ff_hevc_put_hevc_bi_qpel_v48_8_lsx; 111cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[9][1][0] = ff_hevc_put_hevc_bi_qpel_v64_8_lsx; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[3][1][1] = ff_hevc_put_hevc_bi_qpel_hv8_8_lsx; 114cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[5][1][1] = ff_hevc_put_hevc_bi_qpel_hv16_8_lsx; 115cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[6][1][1] = ff_hevc_put_hevc_bi_qpel_hv24_8_lsx; 116cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[7][1][1] = ff_hevc_put_hevc_bi_qpel_hv32_8_lsx; 117cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[8][1][1] = ff_hevc_put_hevc_bi_qpel_hv48_8_lsx; 118cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[9][1][1] = ff_hevc_put_hevc_bi_qpel_hv64_8_lsx; 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[5][0][1] = ff_hevc_put_hevc_bi_qpel_h16_8_lsx; 121cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[6][0][1] = ff_hevc_put_hevc_bi_qpel_h24_8_lsx; 122cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[7][0][1] = ff_hevc_put_hevc_bi_qpel_h32_8_lsx; 123cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[8][0][1] = ff_hevc_put_hevc_bi_qpel_h48_8_lsx; 124cabdff1aSopenharmony_ci c->put_hevc_qpel_bi[9][0][1] = ff_hevc_put_hevc_bi_qpel_h64_8_lsx; 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci c->put_hevc_epel_bi[6][0][1] = ff_hevc_put_hevc_bi_epel_h24_8_lsx; 127cabdff1aSopenharmony_ci c->put_hevc_epel_bi[7][0][1] = ff_hevc_put_hevc_bi_epel_h32_8_lsx; 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci c->put_hevc_epel_bi[4][1][0] = ff_hevc_put_hevc_bi_epel_v12_8_lsx; 130cabdff1aSopenharmony_ci c->put_hevc_epel_bi[5][1][0] = ff_hevc_put_hevc_bi_epel_v16_8_lsx; 131cabdff1aSopenharmony_ci c->put_hevc_epel_bi[6][1][0] = ff_hevc_put_hevc_bi_epel_v24_8_lsx; 132cabdff1aSopenharmony_ci c->put_hevc_epel_bi[7][1][0] = ff_hevc_put_hevc_bi_epel_v32_8_lsx; 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci c->put_hevc_epel_bi[2][1][1] = ff_hevc_put_hevc_bi_epel_hv6_8_lsx; 135cabdff1aSopenharmony_ci c->put_hevc_epel_bi[3][1][1] = ff_hevc_put_hevc_bi_epel_hv8_8_lsx; 136cabdff1aSopenharmony_ci c->put_hevc_epel_bi[5][1][1] = ff_hevc_put_hevc_bi_epel_hv16_8_lsx; 137cabdff1aSopenharmony_ci c->put_hevc_epel_bi[6][1][1] = ff_hevc_put_hevc_bi_epel_hv24_8_lsx; 138cabdff1aSopenharmony_ci c->put_hevc_epel_bi[7][1][1] = ff_hevc_put_hevc_bi_epel_hv32_8_lsx; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[9][0][1] = ff_hevc_put_hevc_uni_qpel_h64_8_lsx; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[6][1][0] = ff_hevc_put_hevc_uni_qpel_v24_8_lsx; 143cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[7][1][0] = ff_hevc_put_hevc_uni_qpel_v32_8_lsx; 144cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[8][1][0] = ff_hevc_put_hevc_uni_qpel_v48_8_lsx; 145cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[9][1][0] = ff_hevc_put_hevc_uni_qpel_v64_8_lsx; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[3][1][1] = ff_hevc_put_hevc_uni_qpel_hv8_8_lsx; 148cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[5][1][1] = ff_hevc_put_hevc_uni_qpel_hv16_8_lsx; 149cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[6][1][1] = ff_hevc_put_hevc_uni_qpel_hv24_8_lsx; 150cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[7][1][1] = ff_hevc_put_hevc_uni_qpel_hv32_8_lsx; 151cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[8][1][1] = ff_hevc_put_hevc_uni_qpel_hv48_8_lsx; 152cabdff1aSopenharmony_ci c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_uni_qpel_hv64_8_lsx; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci c->put_hevc_epel_uni[6][1][0] = ff_hevc_put_hevc_uni_epel_v24_8_lsx; 155cabdff1aSopenharmony_ci c->put_hevc_epel_uni[7][1][0] = ff_hevc_put_hevc_uni_epel_v32_8_lsx; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci c->put_hevc_epel_uni[3][1][1] = ff_hevc_put_hevc_uni_epel_hv8_8_lsx; 158cabdff1aSopenharmony_ci c->put_hevc_epel_uni[4][1][1] = ff_hevc_put_hevc_uni_epel_hv12_8_lsx; 159cabdff1aSopenharmony_ci c->put_hevc_epel_uni[5][1][1] = ff_hevc_put_hevc_uni_epel_hv16_8_lsx; 160cabdff1aSopenharmony_ci c->put_hevc_epel_uni[6][1][1] = ff_hevc_put_hevc_uni_epel_hv24_8_lsx; 161cabdff1aSopenharmony_ci c->put_hevc_epel_uni[7][1][1] = ff_hevc_put_hevc_uni_epel_hv32_8_lsx; 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[3][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv8_8_lsx; 164cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[5][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv16_8_lsx; 165cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[6][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv24_8_lsx; 166cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[7][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv32_8_lsx; 167cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[8][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv48_8_lsx; 168cabdff1aSopenharmony_ci c->put_hevc_qpel_uni_w[9][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv64_8_lsx; 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci c->sao_edge_filter[4] = ff_hevc_sao_edge_filter_8_lsx; 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci c->hevc_h_loop_filter_luma = ff_hevc_loop_filter_luma_h_8_lsx; 173cabdff1aSopenharmony_ci c->hevc_v_loop_filter_luma = ff_hevc_loop_filter_luma_v_8_lsx; 174cabdff1aSopenharmony_ci 175cabdff1aSopenharmony_ci c->hevc_h_loop_filter_luma_c = ff_hevc_loop_filter_luma_h_8_lsx; 176cabdff1aSopenharmony_ci c->hevc_v_loop_filter_luma_c = ff_hevc_loop_filter_luma_v_8_lsx; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci c->hevc_h_loop_filter_chroma = ff_hevc_loop_filter_chroma_h_8_lsx; 179cabdff1aSopenharmony_ci c->hevc_v_loop_filter_chroma = ff_hevc_loop_filter_chroma_v_8_lsx; 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci c->hevc_h_loop_filter_chroma_c = ff_hevc_loop_filter_chroma_h_8_lsx; 182cabdff1aSopenharmony_ci c->hevc_v_loop_filter_chroma_c = ff_hevc_loop_filter_chroma_v_8_lsx; 183cabdff1aSopenharmony_ci 184cabdff1aSopenharmony_ci c->idct[0] = ff_hevc_idct_4x4_lsx; 185cabdff1aSopenharmony_ci c->idct[1] = ff_hevc_idct_8x8_lsx; 186cabdff1aSopenharmony_ci c->idct[2] = ff_hevc_idct_16x16_lsx; 187cabdff1aSopenharmony_ci c->idct[3] = ff_hevc_idct_32x32_lsx; 188cabdff1aSopenharmony_ci } 189cabdff1aSopenharmony_ci } 190cabdff1aSopenharmony_ci} 191