libavcodec/videodsp.h
8c53d39e
 /*
  * Copyright (C) 2012 Ronald S. Bultje
  *
e16bac7b
  * This file is part of FFmpeg.
8c53d39e
  *
e16bac7b
  * FFmpeg is free software; you can redistribute it and/or
8c53d39e
  * 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.
  *
e16bac7b
  * FFmpeg is distributed in the hope that it will be useful,
8c53d39e
  * 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
e16bac7b
  * License along with FFmpeg; if not, write to the Free Software
8c53d39e
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
  * @file
  * Core video DSP helper functions
  */
 
 #ifndef AVCODEC_VIDEODSP_H
 #define AVCODEC_VIDEODSP_H
 
 #include <stddef.h>
 #include <stdint.h>
 
c7e3e554
 #define EMULATED_EDGE(depth) \
91e00c4a
 void ff_emulated_edge_mc_ ## depth(uint8_t *dst, const uint8_t *src, \
                                    ptrdiff_t dst_stride, ptrdiff_t src_stride, \
face578d
                                    int block_w, int block_h,\
                                    int src_x, int src_y, int w, int h);
c7e3e554
 
 EMULATED_EDGE(8)
 EMULATED_EDGE(16)
 
8c53d39e
 typedef struct VideoDSPContext {
     /**
      * Copy a rectangular area of samples to a temporary buffer and replicate
      * the border samples.
      *
face578d
      * @param dst destination buffer
      * @param dst_stride number of bytes between 2 vertically adjacent samples
      *                   in destination buffer
8c53d39e
      * @param src source buffer
91e00c4a
      * @param dst_linesize number of bytes between 2 vertically adjacent
458446ac
      *                     samples in the destination buffer
      * @param src_linesize number of bytes between 2 vertically adjacent
      *                     samples in both the source buffer
8c53d39e
      * @param block_w width of block
      * @param block_h height of block
      * @param src_x x coordinate of the top left sample of the block in the
      *                source buffer
      * @param src_y y coordinate of the top left sample of the block in the
      *                source buffer
      * @param w width of the source buffer
      * @param h height of the source buffer
      */
91e00c4a
     void (*emulated_edge_mc)(uint8_t *dst, const uint8_t *src,
                              ptrdiff_t dst_linesize,
458446ac
                              ptrdiff_t src_linesize,
face578d
                              int block_w, int block_h,
8c53d39e
                              int src_x, int src_y, int w, int h);
 
     /**
      * Prefetch memory into cache (if supported by hardware).
      *
5ce04c14
      * @param buf    pointer to buffer to prefetch memory from
      * @param stride distance between two lines of buf (in bytes)
      * @param h      number of lines to prefetch
8c53d39e
      */
     void (*prefetch)(uint8_t *buf, ptrdiff_t stride, int h);
 } VideoDSPContext;
 
 void ff_videodsp_init(VideoDSPContext *ctx, int bpc);
 
 /* for internal use only (i.e. called by ff_videodsp_init() */
d3789eee
 void ff_videodsp_init_aarch64(VideoDSPContext *ctx, int bpc);
8c53d39e
 void ff_videodsp_init_arm(VideoDSPContext *ctx, int bpc);
 void ff_videodsp_init_ppc(VideoDSPContext *ctx, int bpc);
 void ff_videodsp_init_x86(VideoDSPContext *ctx, int bpc);
df806605
 void ff_videodsp_init_mips(VideoDSPContext *ctx, int bpc);
8c53d39e
 
 #endif /* AVCODEC_VIDEODSP_H */