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 "avcodec.h" 24#include "pixblockdsp.h" 25 26#define BIT_DEPTH 16 27#include "pixblockdsp_template.c" 28#undef BIT_DEPTH 29 30#define BIT_DEPTH 8 31#include "pixblockdsp_template.c" 32 33static void diff_pixels_c(int16_t *av_restrict block, const uint8_t *s1, 34 const uint8_t *s2, int stride) 35{ 36 int i; 37 38 /* read the pixels */ 39 for (i = 0; i < 8; i++) { 40 block[0] = s1[0] - s2[0]; 41 block[1] = s1[1] - s2[1]; 42 block[2] = s1[2] - s2[2]; 43 block[3] = s1[3] - s2[3]; 44 block[4] = s1[4] - s2[4]; 45 block[5] = s1[5] - s2[5]; 46 block[6] = s1[6] - s2[6]; 47 block[7] = s1[7] - s2[7]; 48 s1 += stride; 49 s2 += stride; 50 block += 8; 51 } 52} 53 54av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) 55{ 56 const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8; 57 58 c->diff_pixels = diff_pixels_c; 59 60 switch (avctx->bits_per_raw_sample) { 61 case 9: 62 case 10: 63 case 12: 64 case 14: 65 c->get_pixels = get_pixels_16_c; 66 break; 67 default: 68 if (avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) { 69 c->get_pixels = get_pixels_8_c; 70 } 71 break; 72 } 73 74 if (ARCH_ALPHA) 75 ff_pixblockdsp_init_alpha(c, avctx, high_bit_depth); 76 if (ARCH_ARM) 77 ff_pixblockdsp_init_arm(c, avctx, high_bit_depth); 78 if (ARCH_PPC) 79 ff_pixblockdsp_init_ppc(c, avctx, high_bit_depth); 80 if (ARCH_X86) 81 ff_pixblockdsp_init_x86(c, avctx, high_bit_depth); 82} 83