1/* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19#include <stdint.h> 20 21#include "config.h" 22#include "libavutil/attributes.h" 23#include "libavutil/intreadwrite.h" 24#include "avcodec.h" 25#include "pixblockdsp.h" 26 27static void get_pixels_16_c(int16_t *av_restrict block, const uint8_t *pixels, 28 ptrdiff_t stride) 29{ 30 AV_COPY128U(block + 0 * 8, pixels + 0 * stride); 31 AV_COPY128U(block + 1 * 8, pixels + 1 * stride); 32 AV_COPY128U(block + 2 * 8, pixels + 2 * stride); 33 AV_COPY128U(block + 3 * 8, pixels + 3 * stride); 34 AV_COPY128U(block + 4 * 8, pixels + 4 * stride); 35 AV_COPY128U(block + 5 * 8, pixels + 5 * stride); 36 AV_COPY128U(block + 6 * 8, pixels + 6 * stride); 37 AV_COPY128U(block + 7 * 8, pixels + 7 * stride); 38} 39 40static void get_pixels_8_c(int16_t *av_restrict block, const uint8_t *pixels, 41 ptrdiff_t stride) 42{ 43 int i; 44 45 /* read the pixels */ 46 for (i = 0; i < 8; i++) { 47 block[0] = pixels[0]; 48 block[1] = pixels[1]; 49 block[2] = pixels[2]; 50 block[3] = pixels[3]; 51 block[4] = pixels[4]; 52 block[5] = pixels[5]; 53 block[6] = pixels[6]; 54 block[7] = pixels[7]; 55 pixels += stride; 56 block += 8; 57 } 58} 59 60static void diff_pixels_c(int16_t *av_restrict block, const uint8_t *s1, 61 const uint8_t *s2, ptrdiff_t stride) 62{ 63 int i; 64 65 /* read the pixels */ 66 for (i = 0; i < 8; i++) { 67 block[0] = s1[0] - s2[0]; 68 block[1] = s1[1] - s2[1]; 69 block[2] = s1[2] - s2[2]; 70 block[3] = s1[3] - s2[3]; 71 block[4] = s1[4] - s2[4]; 72 block[5] = s1[5] - s2[5]; 73 block[6] = s1[6] - s2[6]; 74 block[7] = s1[7] - s2[7]; 75 s1 += stride; 76 s2 += stride; 77 block += 8; 78 } 79} 80 81av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) 82{ 83 av_unused const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8; 84 85 c->diff_pixels_unaligned = 86 c->diff_pixels = diff_pixels_c; 87 88 switch (avctx->bits_per_raw_sample) { 89 case 9: 90 case 10: 91 case 12: 92 case 14: 93 c->get_pixels_unaligned = 94 c->get_pixels = get_pixels_16_c; 95 break; 96 default: 97 if (avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) { 98 c->get_pixels_unaligned = 99 c->get_pixels = get_pixels_8_c; 100 } 101 break; 102 } 103 104#if ARCH_AARCH64 105 ff_pixblockdsp_init_aarch64(c, avctx, high_bit_depth); 106#elif ARCH_ALPHA 107 ff_pixblockdsp_init_alpha(c, avctx, high_bit_depth); 108#elif ARCH_ARM 109 ff_pixblockdsp_init_arm(c, avctx, high_bit_depth); 110#elif ARCH_PPC 111 ff_pixblockdsp_init_ppc(c, avctx, high_bit_depth); 112#elif ARCH_X86 113 ff_pixblockdsp_init_x86(c, avctx, high_bit_depth); 114#elif ARCH_MIPS 115 ff_pixblockdsp_init_mips(c, avctx, high_bit_depth); 116#endif 117} 118