diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 1225fcf77d..c3e4f5d1c2 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -70,7 +70,7 @@ OBJS-$(CONFIG_LLVIDDSP) += lossless_videodsp.o OBJS-$(CONFIG_LPC) += lpc.o OBJS-$(CONFIG_LSP) += lsp.o OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o mdct_fixed_32.o -OBJS-$(CONFIG_ME_CMP) += me_cmp.o +OBJS-$(CONFIG_ME_CMP) += me_cmp.o dsputil_compat.o OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \ mpegaudiodecheader.o diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h new file mode 100644 index 0000000000..2f4be85ab7 --- /dev/null +++ b/libavcodec/dsputil.h @@ -0,0 +1,87 @@ +/* + * DSP utils + * Copyright (c) 2000, 2001, 2002 Fabrice Bellard + * Copyright (c) 2002-2004 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * DSP utils. + * This is deprecated + */ + +#ifndef AVCODEC_DSPUTIL_H +#define AVCODEC_DSPUTIL_H + +#include "avcodec.h" +#include "version.h" +#include "me_cmp.h" + +#if FF_API_DSPUTIL + +/* minimum alignment rules ;) + * If you notice errors in the align stuff, need more alignment for some ASM code + * for some CPU or need to use a function with less aligned data then send a mail + * to the ffmpeg-devel mailing list, ... + * + * !warning These alignments might not match reality, (missing attribute((align)) + * stuff somewhere possible). + * I (Michael) did not check them, these are just the alignments which I think + * could be reached easily ... + * + * !future video codecs might need functions with less strict alignment + */ + +struct MpegEncContext; + +/** + * DSPContext. + */ +typedef struct DSPContext { + int (*sum_abs_dctelem)(int16_t *block /* align 16 */); + + me_cmp_func sad[6]; /* identical to pix_absAxA except additional void * */ + me_cmp_func sse[6]; + me_cmp_func hadamard8_diff[6]; + me_cmp_func dct_sad[6]; + me_cmp_func quant_psnr[6]; + me_cmp_func bit[6]; + me_cmp_func rd[6]; + me_cmp_func vsad[6]; + me_cmp_func vsse[6]; + me_cmp_func nsse[6]; + me_cmp_func w53[6]; + me_cmp_func w97[6]; + me_cmp_func dct_max[6]; + me_cmp_func dct264_sad[6]; + + me_cmp_func me_pre_cmp[6]; + me_cmp_func me_cmp[6]; + me_cmp_func me_sub_cmp[6]; + me_cmp_func mb_cmp[6]; + me_cmp_func ildct_cmp[6]; // only width 16 used + me_cmp_func frame_skip_cmp[6]; // only width 8 used + + me_cmp_func pix_abs[2][4]; +} DSPContext; + +attribute_deprecated void avpriv_dsputil_init(DSPContext* p, AVCodecContext *avctx); + +#endif +#endif /* AVCODEC_DSPUTIL_H */ diff --git a/libavcodec/dsputil_compat.c b/libavcodec/dsputil_compat.c new file mode 100644 index 0000000000..7ac1099f16 --- /dev/null +++ b/libavcodec/dsputil_compat.c @@ -0,0 +1,56 @@ +/* + * DSP utils + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "me_cmp.h" +#include "dsputil.h" + +#if FF_API_DSPUTIL + +void avpriv_dsputil_init(DSPContext* p, AVCodecContext *avctx) +{ + MECmpContext mecc; + + ff_me_cmp_init(&mecc, avctx); +#define COPY(name) memcpy(&p->name, &mecc.name, sizeof(p->name)) + COPY(sum_abs_dctelem); + COPY(sad); + COPY(sse); + COPY(hadamard8_diff); + COPY(dct_sad); + COPY(quant_psnr); + COPY(bit); + COPY(rd); + COPY(vsad); + COPY(vsse); + COPY(nsse); + COPY(w53); + COPY(w97); + COPY(dct_max); + COPY(dct264_sad); + COPY(me_pre_cmp); + COPY(me_cmp); + COPY(me_sub_cmp); + COPY(mb_cmp); + COPY(ildct_cmp); + COPY(frame_skip_cmp); + COPY(pix_abs); +} + +#endif diff --git a/libavcodec/version.h b/libavcodec/version.h index 7e57044178..8add94fa0d 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -141,6 +141,9 @@ #ifndef FF_API_EMU_EDGE #define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 56) #endif +#ifndef FF_API_DSPUTIL +#define FF_API_DSPUTIL (LIBAVCODEC_VERSION_MAJOR < 56) +#endif #ifndef FF_API_ARCH_SH4 #define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 56) #endif diff --git a/libavfilter/deshake.h b/libavfilter/deshake.h index 568d022602..615953cfe3 100644 --- a/libavfilter/deshake.h +++ b/libavfilter/deshake.h @@ -24,7 +24,7 @@ #include "config.h" #include "avfilter.h" -#include "libavcodec/me_cmp.h" +#include "libavcodec/dsputil.h" #include "transform.h" #if CONFIG_OPENCL #include "libavutil/opencl.h" @@ -81,7 +81,7 @@ typedef struct { int contrast; ///< Contrast threshold int search; ///< Motion search method AVCodecContext *avctx; - MECmpContext c; ///< Context providing optimized SAD methods + DSPContext c; ///< Context providing optimized SAD methods Transform last; ///< Transform from last frame int refcount; ///< Number of reference frames (defines averaging window) FILE *fp; diff --git a/libavfilter/f_select.c b/libavfilter/f_select.c index 3579665bcb..c7c53b43ed 100644 --- a/libavfilter/f_select.c +++ b/libavfilter/f_select.c @@ -35,7 +35,7 @@ #include "video.h" #if CONFIG_AVCODEC -#include "libavcodec/me_cmp.h" +#include "libavcodec/dsputil.h" #endif static const char *const var_names[] = { @@ -146,7 +146,7 @@ typedef struct SelectContext { int do_scene_detect; ///< 1 if the expression requires scene detection variables, 0 otherwise #if CONFIG_AVCODEC AVCodecContext *avctx; ///< codec context required for the DSPContext (scene detect only) - MECmpContext c; ///< context providing optimized SAD methods (scene detect only) + DSPContext c; ///< context providing optimized SAD methods (scene detect only) double prev_mafd; ///< previous MAFD (scene detect only) #endif AVFrame *prev_picref; ///< previous frame (scene detect only) @@ -245,7 +245,7 @@ static int config_input(AVFilterLink *inlink) select->avctx = avcodec_alloc_context3(NULL); if (!select->avctx) return AVERROR(ENOMEM); - ff_me_cmp_init(&select->c, select->avctx); + avpriv_dsputil_init(&select->c, select->avctx); } #endif return 0; diff --git a/libavfilter/vf_deshake.c b/libavfilter/vf_deshake.c index 9a56b71b39..50aa451a32 100644 --- a/libavfilter/vf_deshake.c +++ b/libavfilter/vf_deshake.c @@ -57,7 +57,7 @@ #include "libavutil/mem.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" -#include "libavcodec/me_cmp.h" +#include "libavcodec/dsputil.h" #include "deshake.h" #include "deshake_opencl.h" @@ -414,7 +414,7 @@ static int config_props(AVFilterLink *link) deshake->last.zoom = 0; deshake->avctx = avcodec_alloc_context3(NULL); - ff_me_cmp_init(&deshake->c, deshake->avctx); + avpriv_dsputil_init(&deshake->c, deshake->avctx); return 0; } diff --git a/libavfilter/vf_mpdecimate.c b/libavfilter/vf_mpdecimate.c index b030f06b19..c667a9f4cc 100644 --- a/libavfilter/vf_mpdecimate.c +++ b/libavfilter/vf_mpdecimate.c @@ -27,7 +27,7 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/timestamp.h" -#include "libavcodec/me_cmp.h" +#include "libavcodec/dsputil.h" #include "libavcodec/pixblockdsp.h" #include "avfilter.h" #include "internal.h" @@ -49,7 +49,7 @@ typedef struct { int hsub, vsub; ///< chroma subsampling values AVFrame *ref; ///< reference picture - MECmpContext mecc; ///< context providing optimized diff routines + DSPContext dspctx; ///< context providing optimized diff routines PixblockDSPContext pdsp; AVCodecContext *avctx; ///< codec context required for the DSPContext } DecimateContext; @@ -76,7 +76,7 @@ static int diff_planes(AVFilterContext *ctx, int w, int h) { DecimateContext *decimate = ctx->priv; - MECmpContext *mecc = &decimate->mecc; + DSPContext *dspctx = &decimate->dspctx; PixblockDSPContext *pdsp = &decimate->pdsp; int x, y; @@ -90,7 +90,7 @@ static int diff_planes(AVFilterContext *ctx, pdsp->diff_pixels(block, cur+x+y*linesize, ref+x+y*linesize, linesize); - d = mecc->sum_abs_dctelem(block); + d = dspctx->sum_abs_dctelem(block); if (d > decimate->hi) return 1; if (d > decimate->lo) { @@ -143,7 +143,7 @@ static av_cold int init(AVFilterContext *ctx) decimate->avctx = avcodec_alloc_context3(NULL); if (!decimate->avctx) return AVERROR(ENOMEM); - ff_me_cmp_init(&decimate->mecc, decimate->avctx); + avpriv_dsputil_init(&decimate->dspctx, decimate->avctx); ff_pixblockdsp_init(&decimate->pdsp, decimate->avctx); return 0;