X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdsputil.h;h=cd9ae08211c3a869cad8d84852110b8f20bd682a;hb=ec0c5d482e6f0cc8c94980494cf6bad39419302c;hp=157426748ceaad05d0b7a1b0b557668c5d1afa54;hpb=9dd6c804537d98f795986867755e285d1091d072;p=ffmpeg diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index 157426748ce..cd9ae08211c 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -27,10 +27,9 @@ * absolutely necessary to call emms_c() between dsp & float/double code */ -#ifndef DSPUTIL_H -#define DSPUTIL_H +#ifndef FFMPEG_DSPUTIL_H +#define FFMPEG_DSPUTIL_H -#include "common.h" #include "avcodec.h" @@ -38,6 +37,7 @@ /* dct code */ typedef short DCTELEM; typedef int DWTELEM; +typedef short IDWTELEM; void fdct_ifast (DCTELEM *data); void fdct_ifast248 (DCTELEM *data); @@ -48,6 +48,7 @@ void j_rev_dct (DCTELEM *data); void j_rev_dct4 (DCTELEM *data); void j_rev_dct2 (DCTELEM *data); void j_rev_dct1 (DCTELEM *data); +void ff_wmv2_idct_c(DCTELEM *data); void ff_fdct_mmx(DCTELEM *block); void ff_fdct_mmx2(DCTELEM *block); @@ -92,11 +93,14 @@ void ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height); /* 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, ... +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 reallity, (missing attribute((align)) stuff somewhere possible) -i (michael) didnt check them, these are just the alignents which i think could be reached easily ... +!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 */ @@ -145,13 +149,32 @@ static void a(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ /* motion estimation */ // h is limited to {width/2, width, 2*width} but never larger than 16 and never smaller then 2 -// allthough currently h<4 is not used as functions with width <8 are not used and neither implemented +// although currently h<4 is not used as functions with width <8 are neither used nor implemented typedef int (*me_cmp_func)(void /*MpegEncContext*/ *s, uint8_t *blk1/*align width (8 or 16)*/, uint8_t *blk2/*align 1*/, int line_size, int h)/* __attribute__ ((const))*/; // for snow slices typedef struct slice_buffer_s slice_buffer; +/** + * Scantable. + */ +typedef struct ScanTable{ + const uint8_t *scantable; + uint8_t permutated[64]; + uint8_t raster_end[64]; +#ifdef ARCH_POWERPC + /** Used by dct_quantize_altivec to find last-non-zero */ + DECLARE_ALIGNED(16, uint8_t, inverse[64]); +#endif +} ScanTable; + +void ff_init_scantable(uint8_t *, ScanTable *st, const uint8_t *src_scantable); + +void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, + int block_w, int block_h, + int src_x, int src_y, int w, int h); + /** * DSPContext. */ @@ -164,6 +187,7 @@ typedef struct DSPContext { void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, uint8_t *pixels/*align 8*/, int line_size); void (*add_pixels8)(uint8_t *pixels, DCTELEM *block, int line_size); void (*add_pixels4)(uint8_t *pixels, DCTELEM *block, int line_size); + int (*sum_abs_dctelem)(DCTELEM *block/*align 16*/); /** * translational global motion compensation. */ @@ -200,9 +224,12 @@ typedef struct DSPContext { me_cmp_func ildct_cmp[5]; //only width 16 used me_cmp_func frame_skip_cmp[5]; //only width 8 used + int (*ssd_int8_vs_int16)(const int8_t *pix1, const int16_t *pix2, + int size); + /** * Halfpel motion compensation with rounding (a+b+1)>>1. - * this is an array[4][4] of motion compensation funcions for 4 + * this is an array[4][4] of motion compensation functions for 4 * horizontal blocksizes (8,16) and the 4 halfpel positions
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ] * @param block destination where the result is stored @@ -226,7 +253,7 @@ typedef struct DSPContext { /** * Halfpel motion compensation with no rounding (a+b)>>1. - * this is an array[2][4] of motion compensation funcions for 2 + * this is an array[2][4] of motion compensation functions for 2 * horizontal blocksizes (8,16) and the 4 halfpel positions
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ] * @param block destination where the result is stored @@ -238,7 +265,7 @@ typedef struct DSPContext { /** * Halfpel motion compensation with no rounding (a+b)>>1. - * this is an array[2][4] of motion compensation funcions for 2 + * this is an array[2][4] of motion compensation functions for 2 * horizontal blocksizes (8,16) and the 4 halfpel positions
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ] * @param block destination into which the result is averaged (a+b)>>1 @@ -252,7 +279,8 @@ typedef struct DSPContext { /** * Thirdpel motion compensation with rounding (a+b+1)>>1. - * this is an array[12] of motion compensation funcions for the 9 thirdpel positions
+ * this is an array[12] of motion compensation functions for the 9 thirdpe + * positions
* *pixels_tab[ xthirdpel + 4*ythirdpel ] * @param block destination where the result is stored * @param pixels source @@ -269,7 +297,7 @@ typedef struct DSPContext { qpel_mc_func put_mspel_pixels_tab[8]; /** - * h264 Chram MC + * h264 Chroma MC */ h264_chroma_mc_func put_h264_chroma_pixels_tab[3]; /* This is really one func used in VC-1 decoding */ @@ -298,13 +326,16 @@ typedef struct DSPContext { /* huffyuv specific */ void (*add_bytes)(uint8_t *dst/*align 16*/, uint8_t *src/*align 16*/, int w); + void (*add_bytes_l2)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 16*/, int w); void (*diff_bytes)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 1*/,int w); /** * subtract huffyuv's variant of median prediction * note, this might read from src1[-1], src2[-1] */ void (*sub_hfyu_median_prediction)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top); - void (*bswap_buf)(uint32_t *dst, uint32_t *src, int w); + /* this might write to dst[w] */ + void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp); + void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w); void (*h264_v_loop_filter_luma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0); void (*h264_h_loop_filter_luma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0); @@ -321,8 +352,13 @@ typedef struct DSPContext { void (*h261_loop_filter)(uint8_t *src, int stride); + void (*x8_v_loop_filter)(uint8_t *src, int stride, int qscale); + void (*x8_h_loop_filter)(uint8_t *src, int stride, int qscale); + /* assume len is a multiple of 4, and arrays are 16-byte aligned */ void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize); + /* no alignment needed */ + void (*flac_compute_autocorr)(const int32_t *data, int len, int lag, double *autoc); /* assume len is a multiple of 8, and arrays are 16-byte aligned */ void (*vector_fmul)(float *dst, const float *src, int len); void (*vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len); @@ -343,13 +379,13 @@ typedef struct DSPContext { /** * block -> idct -> clip to unsigned 8 bit -> dest. * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...) - * @param line_size size in bytes of a horizotal line of dest + * @param line_size size in bytes of a horizontal line of dest */ void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); /** * block -> idct -> add dest -> clip to unsigned 8 bit -> dest. - * @param line_size size in bytes of a horizotal line of dest + * @param line_size size in bytes of a horizontal line of dest */ void (*idct_add)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); @@ -372,12 +408,16 @@ typedef struct DSPContext { #define FF_SIMPLE_IDCT_PERM 3 #define FF_TRANSPOSE_IDCT_PERM 4 #define FF_PARTTRANS_IDCT_PERM 5 +#define FF_SSE2_IDCT_PERM 6 int (*try_8x8basis)(int16_t rem[64], int16_t weight[64], int16_t basis[64], int scale); void (*add_8x8basis)(int16_t rem[64], int16_t basis[64], int scale); #define BASIS_SHIFT 16 #define RECON_SHIFT 6 + void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w); +#define EDGE_WIDTH 16 + /* h264 functions */ void (*h264_idct_add)(uint8_t *dst, DCTELEM *block, int stride); void (*h264_idct8_add)(uint8_t *dst, DCTELEM *block, int stride); @@ -386,8 +426,8 @@ typedef struct DSPContext { void (*h264_dct)(DCTELEM block[4][4]); /* snow wavelet */ - void (*vertical_compose97i)(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width); - void (*horizontal_compose97i)(DWTELEM *b, int width); + void (*vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width); + void (*horizontal_compose97i)(IDWTELEM *b, int width); void (*inner_add_yblock)(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8); void (*prefetch)(void *mem, int stride, int h); @@ -396,15 +436,21 @@ typedef struct DSPContext { /* vc1 functions */ void (*vc1_inv_trans_8x8)(DCTELEM *b); - void (*vc1_inv_trans_8x4)(DCTELEM *b, int n); - void (*vc1_inv_trans_4x8)(DCTELEM *b, int n); - void (*vc1_inv_trans_4x4)(DCTELEM *b, int n); + void (*vc1_inv_trans_8x4)(uint8_t *dest, int line_size, DCTELEM *block); + void (*vc1_inv_trans_4x8)(uint8_t *dest, int line_size, DCTELEM *block); + void (*vc1_inv_trans_4x4)(uint8_t *dest, int line_size, DCTELEM *block); void (*vc1_v_overlap)(uint8_t* src, int stride); void (*vc1_h_overlap)(uint8_t* src, int stride); /* put 8x8 block with bicubic interpolation and quarterpel precision * last argument is actually round value instead of height */ op_pixels_func put_vc1_mspel_pixels_tab[16]; + + /* intrax8 functions */ + void (*x8_spatial_compensation[12])(uint8_t *src , uint8_t *dst, int linesize); + void (*x8_setup_spatial_compensation)(uint8_t *src, uint8_t *dst, int linesize, + int * range, int * sum, int edges); + } DSPContext; void dsputil_static_init(void); @@ -467,11 +513,17 @@ static inline int get_penalty_factor(int lambda, int lambda2, int type){ one or more MultiMedia extension */ int mm_support(void); -#ifdef __GNUC__ - #define DECLARE_ALIGNED_16(t,v) t v __attribute__ ((aligned (16))) -#else - #define DECLARE_ALIGNED_16(t,v) __declspec(align(16)) t v -#endif +void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_bfin(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_mlib(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_mmi(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx); + +#define DECLARE_ALIGNED_16(t, v) DECLARE_ALIGNED(16, t, v) #if defined(HAVE_MMX) @@ -494,7 +546,7 @@ void put_signed_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int li static inline void emms(void) { - __asm __volatile ("emms;":::"memory"); + asm volatile ("emms;":::"memory"); } @@ -504,95 +556,36 @@ static inline void emms(void) emms();\ } -#ifdef __GNUC__ - #define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#else - #define DECLARE_ALIGNED_8(t,v) __declspec(align(8)) t v -#endif - -#define STRIDE_ALIGN 8 - -void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx); void dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx); #elif defined(ARCH_ARMV4L) -/* This is to use 4 bytes read to the IDCT pointers for some 'zero' - line optimizations */ -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (4))) -#define STRIDE_ALIGN 4 - #define MM_IWMMXT 0x0100 /* XScale IWMMXT */ extern int mm_flags; -void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx); - -#elif defined(HAVE_MLIB) - -/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */ -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 - -void dsputil_init_mlib(DSPContext* c, AVCodecContext *avctx); - -#elif defined(ARCH_SPARC) - -/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */ -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 -void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx); - -#elif defined(ARCH_ALPHA) - -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 - -void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx); - #elif defined(ARCH_POWERPC) #define MM_ALTIVEC 0x0001 /* standard AltiVec */ extern int mm_flags; -#if defined(HAVE_ALTIVEC) && !defined(CONFIG_DARWIN) -#define pixel altivec_pixel -#include -#undef pixel -#endif - -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (16))) +#define DECLARE_ALIGNED_8(t, v) DECLARE_ALIGNED(16, t, v) #define STRIDE_ALIGN 16 -void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx); - #elif defined(HAVE_MMI) -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (16))) +#define DECLARE_ALIGNED_8(t, v) DECLARE_ALIGNED(16, t, v) #define STRIDE_ALIGN 16 -void dsputil_init_mmi(DSPContext* c, AVCodecContext *avctx); - -#elif defined(ARCH_SH4) - -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 - -void dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx); - -#elif defined(ARCH_BFIN) - -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 - -void dsputil_init_bfin(DSPContext* c, AVCodecContext *avctx); - -#else +#endif -#define DECLARE_ALIGNED_8(t,v) t v __attribute__ ((aligned (8))) -#define STRIDE_ALIGN 8 +#ifndef DECLARE_ALIGNED_8 +# define DECLARE_ALIGNED_8(t, v) DECLARE_ALIGNED(8, t, v) +#endif +#ifndef STRIDE_ALIGN +# define STRIDE_ALIGN 8 #endif /* PSNR */ @@ -648,6 +641,14 @@ typedef struct MDCTContext { FFTContext fft; } MDCTContext; +/** + * Generate a Kaiser-Bessel Derived Window. + * @param window pointer to half window + * @param alpha determines window shape + * @param n size of half window + */ +void ff_kbd_window_init(float *window, float alpha, int n); + int ff_mdct_init(MDCTContext *s, int nbits, int inverse); void ff_imdct_calc(MDCTContext *s, FFTSample *output, const FFTSample *input, FFTSample *tmp); @@ -659,13 +660,13 @@ void ff_mdct_calc(MDCTContext *s, FFTSample *out, const FFTSample *input, FFTSample *tmp); void ff_mdct_end(MDCTContext *s); -#define WARPER8_16(name8, name16)\ +#define WRAPPER8_16(name8, name16)\ static int name16(void /*MpegEncContext*/ *s, uint8_t *dst, uint8_t *src, int stride, int h){\ return name8(s, dst , src , stride, h)\ +name8(s, dst+8 , src+8 , stride, h);\ } -#define WARPER8_16_SQ(name8, name16)\ +#define WRAPPER8_16_SQ(name8, name16)\ static int name16(void /*MpegEncContext*/ *s, uint8_t *dst, uint8_t *src, int stride, int h){\ int score=0;\ score +=name8(s, dst , src , stride, 8);\ @@ -685,7 +686,7 @@ static inline void copy_block2(uint8_t *dst, uint8_t *src, int dstStride, int sr int i; for(i=0; i