dsputil_mmx.h 4.44 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * MMX optimized DSP utils
 * Copyright (c) 2007  Aurelien Jacobs <aurel@gnuage.org>
 *
 * 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
 */

22 23
#ifndef AVCODEC_X86_DSPUTIL_MMX_H
#define AVCODEC_X86_DSPUTIL_MMX_H
24

25
#include <stdint.h>
26
#include "libavcodec/dsputil.h"
27
#include "libavutil/x86/asm.h"
28

29
typedef struct xmm_reg { uint64_t a, b; } xmm_reg;
30

31 32
extern const uint64_t ff_bone;
extern const uint64_t ff_wtwo;
33

34
extern const xmm_reg  ff_pw_3;
David Conrad's avatar
David Conrad committed
35
extern const xmm_reg  ff_pw_4;
36 37
extern const xmm_reg  ff_pw_5;
extern const xmm_reg  ff_pw_8;
38
extern const uint64_t ff_pw_15;
39
extern const xmm_reg  ff_pw_16;
40
extern const xmm_reg  ff_pw_18;
41
extern const uint64_t ff_pw_20;
42
extern const xmm_reg  ff_pw_27;
43 44
extern const xmm_reg  ff_pw_28;
extern const xmm_reg  ff_pw_32;
45
extern const uint64_t ff_pw_42;
46 47
extern const uint64_t ff_pw_53;
extern const xmm_reg  ff_pw_63;
48
extern const xmm_reg  ff_pw_64;
49 50
extern const uint64_t ff_pw_96;
extern const uint64_t ff_pw_128;
51
extern const uint64_t ff_pw_255;
52

53
extern const xmm_reg  ff_pb_1;
54
extern const xmm_reg  ff_pb_3;
55
extern const uint64_t ff_pb_7;
David Conrad's avatar
David Conrad committed
56
extern const uint64_t ff_pb_1F;
57
extern const uint64_t ff_pb_3F;
David Conrad's avatar
David Conrad committed
58
extern const uint64_t ff_pb_81;
59
extern const xmm_reg  ff_pb_A1;
60
extern const xmm_reg  ff_pb_F8;
61
extern const uint64_t ff_pb_FC;
62
extern const xmm_reg  ff_pb_FE;
63 64 65 66

extern const double ff_pd_1[2];
extern const double ff_pd_2[2];

67 68 69 70 71 72 73 74 75 76 77
#define SBUTTERFLY(a,b,t,n,m)\
    "mov" #m " " #a ", " #t "         \n\t" /* abcd */\
    "punpckl" #n " " #b ", " #a "     \n\t" /* aebf */\
    "punpckh" #n " " #b ", " #t "     \n\t" /* cgdh */\

#define TRANSPOSE4(a,b,c,d,t)\
    SBUTTERFLY(a,b,t,wd,q) /* a=aebf t=cgdh */\
    SBUTTERFLY(c,d,b,wd,q) /* c=imjn b=kolp */\
    SBUTTERFLY(a,c,d,dq,q) /* a=aeim d=bfjn */\
    SBUTTERFLY(t,b,c,dq,q) /* t=cgko c=dhlp */

78
#define MOVQ_WONE(regd) \
79
    __asm__ volatile ( \
80 81 82
    "pcmpeqd %%" #regd ", %%" #regd " \n\t" \
    "psrlw $15, %%" #regd ::)

83 84
void ff_dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx);
void ff_dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx);
85

Diego Biurrun's avatar
Diego Biurrun committed
86 87 88
void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels, int line_size);
void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels, int line_size);
void ff_put_signed_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels, int line_size);
89

90 91 92 93
void ff_put_cavs_qpel8_mc00_mmxext(uint8_t *dst, uint8_t *src, int stride);
void ff_avg_cavs_qpel8_mc00_mmxext(uint8_t *dst, uint8_t *src, int stride);
void ff_put_cavs_qpel16_mc00_mmxext(uint8_t *dst, uint8_t *src, int stride);
void ff_avg_cavs_qpel16_mc00_mmxext(uint8_t *dst, uint8_t *src, int stride);
94 95

void ff_put_vc1_mspel_mc00_mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd);
96
void ff_avg_vc1_mspel_mc00_mmxext(uint8_t *dst, const uint8_t *src, int stride, int rnd);
97

98 99 100 101 102
void ff_put_rv40_qpel8_mc33_mmx(uint8_t *block, uint8_t *pixels, int line_size);
void ff_put_rv40_qpel16_mc33_mmx(uint8_t *block, uint8_t *pixels, int line_size);
void ff_avg_rv40_qpel8_mc33_mmx(uint8_t *block, uint8_t *pixels, int line_size);
void ff_avg_rv40_qpel16_mc33_mmx(uint8_t *block, uint8_t *pixels, int line_size);

103 104
void ff_mmx_idct(int16_t *block);
void ff_mmxext_idct(int16_t *block);
105

106 107 108 109 110 111 112 113 114 115 116 117 118

void ff_deinterlace_line_mmx(uint8_t *dst,
                             const uint8_t *lum_m4, const uint8_t *lum_m3,
                             const uint8_t *lum_m2, const uint8_t *lum_m1,
                             const uint8_t *lum,
                             int size);

void ff_deinterlace_line_inplace_mmx(const uint8_t *lum_m4,
                                     const uint8_t *lum_m3,
                                     const uint8_t *lum_m2,
                                     const uint8_t *lum_m1,
                                     const uint8_t *lum, int size);

119
#endif /* AVCODEC_X86_DSPUTIL_MMX_H */