diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/dsputil.h')
-rw-r--r-- | src/libffmpeg/libavcodec/dsputil.h | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/src/libffmpeg/libavcodec/dsputil.h b/src/libffmpeg/libavcodec/dsputil.h index 8c3fdb716..3a26cddcf 100644 --- a/src/libffmpeg/libavcodec/dsputil.h +++ b/src/libffmpeg/libavcodec/dsputil.h @@ -28,13 +28,12 @@ typedef short DCTELEM; void fdct_ifast (DCTELEM *data); +void ff_jpeg_fdct_islow (DCTELEM *data); void j_rev_dct (DCTELEM *data); void fdct_mmx(DCTELEM *block); -extern void (*av_fdct)(DCTELEM *block); - /* encoding scans */ extern UINT8 ff_alternate_horizontal_scan[64]; extern UINT8 ff_alternate_vertical_scan[64]; @@ -52,17 +51,29 @@ extern UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; void dsputil_init(void); +/* minimum alignment rules ;) +if u 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-dev list, ... + +!warning these alignments might not match reallity, (missing attribute((align)) stuff somewhere possible) +i (michael) didnt check them, these are just the alignents which i think could be reached easily ... + +!future video codecs might need functions with less strict alignment +*/ + /* pixel ops : interface with DCT */ +extern void (*ff_idct)(DCTELEM *block/*align 16*/); +extern void (*ff_idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); +extern void (*ff_idct_add)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); +extern void (*get_pixels)(DCTELEM *block/*align 16*/, const UINT8 *pixels/*align 8*/, int line_size); +extern void (*diff_pixels)(DCTELEM *block/*align 16*/, const UINT8 *s1/*align 8*/, const UINT8 *s2/*align 8*/, int stride); +extern void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size); +extern void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size); +extern void (*gmc1)(UINT8 *dst/*align 8*/, UINT8 *src/*align 1*/, int srcStride, int h, int x16, int y16, int rounder); +extern void (*clear_blocks)(DCTELEM *blocks/*align 16*/); +extern int (*pix_sum)(UINT8 * pix, int line_size); +extern int (*pix_norm1)(UINT8 * pix, int line_size); -extern void (*ff_idct)(DCTELEM *block); -extern void (*ff_idct_put)(UINT8 *dest, int line_size, DCTELEM *block); -extern void (*ff_idct_add)(UINT8 *dest, int line_size, DCTELEM *block); -extern void (*get_pixels)(DCTELEM *block, const UINT8 *pixels, int line_size); -extern void (*diff_pixels)(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride); -extern void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); -extern void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); -extern void (*gmc1)(UINT8 *dst, UINT8 *src, int srcStride, int h, int x16, int y16, int rounder); -extern void (*clear_blocks)(DCTELEM *blocks); void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size); @@ -72,19 +83,28 @@ void add_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size); void clear_blocks_c(DCTELEM *blocks); /* add and put pixel (decoding) */ -typedef void (*op_pixels_func)(UINT8 *block, const UINT8 *pixels, int line_size, int h); -typedef void (*qpel_mc_func)(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my); - -extern op_pixels_func put_pixels_tab[4]; -extern op_pixels_func avg_pixels_tab[4]; -extern op_pixels_func put_no_rnd_pixels_tab[4]; -extern op_pixels_func avg_no_rnd_pixels_tab[4]; -extern qpel_mc_func qpel_mc_rnd_tab[16]; -extern qpel_mc_func qpel_mc_no_rnd_tab[16]; +// blocksizes for op_pixels_func are 8x4,8x8 16x8 16x16 +typedef void (*op_pixels_func)(UINT8 *block/*align width (8 or 16)*/, const UINT8 *pixels/*align 1*/, int line_size, int h); +typedef void (*qpel_mc_func)(UINT8 *dst/*align width (8 or 16)*/, UINT8 *src/*align 1*/, int stride); + +extern op_pixels_func put_pixels_tab[2][4]; +extern op_pixels_func avg_pixels_tab[2][4]; +extern op_pixels_func put_no_rnd_pixels_tab[2][4]; +extern op_pixels_func avg_no_rnd_pixels_tab[2][4]; +extern qpel_mc_func put_qpel_pixels_tab[2][16]; +extern qpel_mc_func avg_qpel_pixels_tab[2][16]; +extern qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16]; +extern qpel_mc_func avg_no_rnd_qpel_pixels_tab[2][16]; + +#define CALL_2X_PIXELS(a, b, n)\ +static void a(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ + b(block , pixels , line_size, h);\ + b(block+n, pixels+n, line_size, h);\ +} /* motion estimation */ -typedef int (*op_pixels_abs_func)(UINT8 *blk1, UINT8 *blk2, int line_size); +typedef int (*op_pixels_abs_func)(UINT8 *blk1/*align width (8 or 16)*/, UINT8 *blk2/*align 1*/, int line_size); extern op_pixels_abs_func pix_abs16x16; extern op_pixels_abs_func pix_abs16x16_x2; @@ -170,6 +190,13 @@ void dsputil_init_mlib(void); void dsputil_init_alpha(void); +#elif defined(ARCH_POWERPC) + +#define emms_c() +#define __align8 __attribute__ ((aligned (16))) + +void dsputil_init_ppc(void); + #else #define emms_c() |