1/* 2 * Lossless video DSP utils 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include "config.h" 22#include "../lossless_videodsp.h" 23#include "libavutil/x86/cpu.h" 24 25void ff_add_bytes_sse2(uint8_t *dst, uint8_t *src, ptrdiff_t w); 26void ff_add_bytes_avx2(uint8_t *dst, uint8_t *src, ptrdiff_t w); 27 28void ff_add_median_pred_sse2(uint8_t *dst, const uint8_t *top, 29 const uint8_t *diff, ptrdiff_t w, 30 int *left, int *left_top); 31 32int ff_add_left_pred_ssse3(uint8_t *dst, const uint8_t *src, 33 ptrdiff_t w, int left); 34int ff_add_left_pred_unaligned_ssse3(uint8_t *dst, const uint8_t *src, 35 ptrdiff_t w, int left); 36int ff_add_left_pred_unaligned_avx2(uint8_t *dst, const uint8_t *src, 37 ptrdiff_t w, int left); 38 39int ff_add_left_pred_int16_ssse3(uint16_t *dst, const uint16_t *src, unsigned mask, ptrdiff_t w, unsigned acc); 40int ff_add_left_pred_int16_unaligned_ssse3(uint16_t *dst, const uint16_t *src, unsigned mask, ptrdiff_t w, unsigned acc); 41 42void ff_add_gradient_pred_ssse3(uint8_t *src, const ptrdiff_t stride, const ptrdiff_t width); 43void ff_add_gradient_pred_avx2(uint8_t *src, const ptrdiff_t stride, const ptrdiff_t width); 44 45void ff_llviddsp_init_x86(LLVidDSPContext *c) 46{ 47 int cpu_flags = av_get_cpu_flags(); 48 49 if (EXTERNAL_SSE2(cpu_flags)) { 50 c->add_bytes = ff_add_bytes_sse2; 51 c->add_median_pred = ff_add_median_pred_sse2; 52 } 53 54 if (EXTERNAL_SSSE3(cpu_flags)) { 55 c->add_left_pred = ff_add_left_pred_ssse3; 56 c->add_left_pred_int16 = ff_add_left_pred_int16_ssse3; 57 c->add_gradient_pred = ff_add_gradient_pred_ssse3; 58 } 59 60 if (EXTERNAL_SSSE3_FAST(cpu_flags)) { 61 c->add_left_pred = ff_add_left_pred_unaligned_ssse3; 62 c->add_left_pred_int16 = ff_add_left_pred_int16_unaligned_ssse3; 63 } 64 65 if (EXTERNAL_AVX2_FAST(cpu_flags)) { 66 c->add_bytes = ff_add_bytes_avx2; 67 c->add_left_pred = ff_add_left_pred_unaligned_avx2; 68 c->add_gradient_pred = ff_add_gradient_pred_avx2; 69 } 70} 71