me_cmp.h (3535B)
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 #ifndef AVCODEC_ME_CMP_H 20 #define AVCODEC_ME_CMP_H 21 22 #include <stdint.h> 23 24 #include "libavutil/attributes_internal.h" 25 26 #include "avcodec.h" 27 28 extern const uint32_t attribute_visibility_hidden ff_square_tab[512]; 29 30 31 /* minimum alignment rules ;) 32 * If you notice errors in the align stuff, need more alignment for some ASM code 33 * for some CPU or need to use a function with less aligned data then send a mail 34 * to the ffmpeg-devel mailing list, ... 35 * 36 * !warning These alignments might not match reality, (missing attribute((align)) 37 * stuff somewhere possible). 38 * I (Michael) did not check them, these are just the alignments which I think 39 * could be reached easily ... 40 * 41 * !future video codecs might need functions with less strict alignment 42 */ 43 44 struct MpegEncContext; 45 /* Motion estimation: 46 * h is limited to { width / 2, width, 2 * width }, 47 * but never larger than 16 and never smaller than 2. 48 * Although currently h < 4 is not used as functions with 49 * width < 8 are neither used nor implemented. */ 50 typedef int (*me_cmp_func)(struct MpegEncContext *c, 51 const uint8_t *blk1 /* align width (8 or 16) */, 52 const uint8_t *blk2 /* align 1 */, ptrdiff_t stride, 53 int h); 54 55 typedef struct MECmpContext { 56 int (*sum_abs_dctelem)(const int16_t *block /* align 16 */); 57 58 me_cmp_func sad[6]; /* identical to pix_absAxA except additional void * */ 59 me_cmp_func sse[6]; 60 me_cmp_func hadamard8_diff[6]; 61 me_cmp_func dct_sad[6]; 62 me_cmp_func quant_psnr[6]; 63 me_cmp_func bit[6]; 64 me_cmp_func rd[6]; 65 me_cmp_func vsad[6]; 66 me_cmp_func vsse[6]; 67 me_cmp_func nsse[6]; 68 me_cmp_func w53[6]; 69 me_cmp_func w97[6]; 70 me_cmp_func dct_max[6]; 71 me_cmp_func dct264_sad[6]; 72 73 me_cmp_func pix_abs[2][4]; 74 me_cmp_func median_sad[6]; 75 } MECmpContext; 76 77 void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx); 78 void ff_me_cmp_init_aarch64(MECmpContext *c, AVCodecContext *avctx); 79 void ff_me_cmp_init_alpha(MECmpContext *c, AVCodecContext *avctx); 80 void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx); 81 void ff_me_cmp_init_ppc(MECmpContext *c, AVCodecContext *avctx); 82 void ff_me_cmp_init_riscv(MECmpContext *c, AVCodecContext *avctx); 83 void ff_me_cmp_init_x86(MECmpContext *c, AVCodecContext *avctx); 84 void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx); 85 86 /** 87 * Fill the function pointer array cmp[6] with me_cmp_funcs from 88 * c based upon type. If mpvenc is not set, an error is returned 89 * if the type of comparison functions requires an initialized 90 * MpegEncContext. 91 */ 92 int ff_set_cmp(const MECmpContext *c, me_cmp_func *cmp, 93 int type, int mpvenc); 94 95 void ff_dsputil_init_dwt(MECmpContext *c); 96 97 #endif /* AVCODEC_ME_CMP_H */