⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegvideo_mmx.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
                "punpckhwd %%mm1, %%mm1         \n\t"                "punpckhdq %%mm1, %%mm1         \n\t"                "movq %%mm1, (%0, %2)           \n\t"                "add %1, %0                     \n\t"                "cmp %3, %0                     \n\t"                " jb 1b                         \n\t"                : "+r" (ptr)                : "r" ((long)wrap), "r" ((long)width), "r" (ptr + wrap*height)        );    }    else    {        asm volatile(                "1:                             \n\t"                "movd (%0), %%mm0               \n\t"                "punpcklbw %%mm0, %%mm0         \n\t"                "punpcklwd %%mm0, %%mm0         \n\t"                "punpckldq %%mm0, %%mm0         \n\t"                "movq %%mm0, -8(%0)             \n\t"                "movq %%mm0, -16(%0)            \n\t"                "movq -8(%0, %2), %%mm1         \n\t"                "punpckhbw %%mm1, %%mm1         \n\t"                "punpckhwd %%mm1, %%mm1         \n\t"                "punpckhdq %%mm1, %%mm1         \n\t"                "movq %%mm1, (%0, %2)           \n\t"                "movq %%mm1, 8(%0, %2)          \n\t"                "add %1, %0                     \n\t"                "cmp %3, %0                     \n\t"                " jb 1b                         \n\t"                : "+r" (ptr)                : "r" ((long)wrap), "r" ((long)width), "r" (ptr + wrap*height)        );    }    for(i=0;i<w;i+=4) {        /* top and bottom (and hopefully also the corners) */        ptr= buf - (i + 1) * wrap - w;        asm volatile(                "1:                             \n\t"                "movq (%1, %0), %%mm0           \n\t"                "movq %%mm0, (%0)               \n\t"                "movq %%mm0, (%0, %2)           \n\t"                "movq %%mm0, (%0, %2, 2)        \n\t"                "movq %%mm0, (%0, %3)           \n\t"                "add $8, %0                     \n\t"                "cmp %4, %0                     \n\t"                " jb 1b                         \n\t"                : "+r" (ptr)                : "r" ((long)buf - (long)ptr - w), "r" ((long)-wrap), "r" ((long)-wrap*3), "r" (ptr+width+2*w)        );        ptr= last_line + (i + 1) * wrap - w;        asm volatile(                "1:                             \n\t"                "movq (%1, %0), %%mm0           \n\t"                "movq %%mm0, (%0)               \n\t"                "movq %%mm0, (%0, %2)           \n\t"                "movq %%mm0, (%0, %2, 2)        \n\t"                "movq %%mm0, (%0, %3)           \n\t"                "add $8, %0                     \n\t"                "cmp %4, %0                     \n\t"                " jb 1b                         \n\t"                : "+r" (ptr)                : "r" ((long)last_line - (long)ptr - w), "r" ((long)wrap), "r" ((long)wrap*3), "r" (ptr+width+2*w)        );    }}static void  denoise_dct_mmx(MpegEncContext *s, DCTELEM *block){    const int intra= s->mb_intra;    int *sum= s->dct_error_sum[intra];    uint16_t *offset= s->dct_offset[intra];    s->dct_count[intra]++;    asm volatile(        "pxor %%mm7, %%mm7                      \n\t"        "1:                                     \n\t"        "pxor %%mm0, %%mm0                      \n\t"        "pxor %%mm1, %%mm1                      \n\t"        "movq (%0), %%mm2                       \n\t"        "movq 8(%0), %%mm3                      \n\t"        "pcmpgtw %%mm2, %%mm0                   \n\t"        "pcmpgtw %%mm3, %%mm1                   \n\t"        "pxor %%mm0, %%mm2                      \n\t"        "pxor %%mm1, %%mm3                      \n\t"        "psubw %%mm0, %%mm2                     \n\t"        "psubw %%mm1, %%mm3                     \n\t"        "movq %%mm2, %%mm4                      \n\t"        "movq %%mm3, %%mm5                      \n\t"        "psubusw (%2), %%mm2                    \n\t"        "psubusw 8(%2), %%mm3                   \n\t"        "pxor %%mm0, %%mm2                      \n\t"        "pxor %%mm1, %%mm3                      \n\t"        "psubw %%mm0, %%mm2                     \n\t"        "psubw %%mm1, %%mm3                     \n\t"        "movq %%mm2, (%0)                       \n\t"        "movq %%mm3, 8(%0)                      \n\t"        "movq %%mm4, %%mm2                      \n\t"        "movq %%mm5, %%mm3                      \n\t"        "punpcklwd %%mm7, %%mm4                 \n\t"        "punpckhwd %%mm7, %%mm2                 \n\t"        "punpcklwd %%mm7, %%mm5                 \n\t"        "punpckhwd %%mm7, %%mm3                 \n\t"        "paddd (%1), %%mm4                      \n\t"        "paddd 8(%1), %%mm2                     \n\t"        "paddd 16(%1), %%mm5                    \n\t"        "paddd 24(%1), %%mm3                    \n\t"        "movq %%mm4, (%1)                       \n\t"        "movq %%mm2, 8(%1)                      \n\t"        "movq %%mm5, 16(%1)                     \n\t"        "movq %%mm3, 24(%1)                     \n\t"        "add $16, %0                            \n\t"        "add $32, %1                            \n\t"        "add $16, %2                            \n\t"        "cmp %3, %0                             \n\t"            " jb 1b                             \n\t"        : "+r" (block), "+r" (sum), "+r" (offset)        : "r"(block+64)    );}static void  denoise_dct_sse2(MpegEncContext *s, DCTELEM *block){    const int intra= s->mb_intra;    int *sum= s->dct_error_sum[intra];    uint16_t *offset= s->dct_offset[intra];    s->dct_count[intra]++;    asm volatile(        "pxor %%xmm7, %%xmm7                    \n\t"        "1:                                     \n\t"        "pxor %%xmm0, %%xmm0                    \n\t"        "pxor %%xmm1, %%xmm1                    \n\t"        "movdqa (%0), %%xmm2                    \n\t"        "movdqa 16(%0), %%xmm3                  \n\t"        "pcmpgtw %%xmm2, %%xmm0                 \n\t"        "pcmpgtw %%xmm3, %%xmm1                 \n\t"        "pxor %%xmm0, %%xmm2                    \n\t"        "pxor %%xmm1, %%xmm3                    \n\t"        "psubw %%xmm0, %%xmm2                   \n\t"        "psubw %%xmm1, %%xmm3                   \n\t"        "movdqa %%xmm2, %%xmm4                  \n\t"        "movdqa %%xmm3, %%xmm5                  \n\t"        "psubusw (%2), %%xmm2                   \n\t"        "psubusw 16(%2), %%xmm3                 \n\t"        "pxor %%xmm0, %%xmm2                    \n\t"        "pxor %%xmm1, %%xmm3                    \n\t"        "psubw %%xmm0, %%xmm2                   \n\t"        "psubw %%xmm1, %%xmm3                   \n\t"        "movdqa %%xmm2, (%0)                    \n\t"        "movdqa %%xmm3, 16(%0)                  \n\t"        "movdqa %%xmm4, %%xmm6                  \n\t"        "movdqa %%xmm5, %%xmm0                  \n\t"        "punpcklwd %%xmm7, %%xmm4               \n\t"        "punpckhwd %%xmm7, %%xmm6               \n\t"        "punpcklwd %%xmm7, %%xmm5               \n\t"        "punpckhwd %%xmm7, %%xmm0               \n\t"        "paddd (%1), %%xmm4                     \n\t"        "paddd 16(%1), %%xmm6                   \n\t"        "paddd 32(%1), %%xmm5                   \n\t"        "paddd 48(%1), %%xmm0                   \n\t"        "movdqa %%xmm4, (%1)                    \n\t"        "movdqa %%xmm6, 16(%1)                  \n\t"        "movdqa %%xmm5, 32(%1)                  \n\t"        "movdqa %%xmm0, 48(%1)                  \n\t"        "add $32, %0                            \n\t"        "add $64, %1                            \n\t"        "add $32, %2                            \n\t"        "cmp %3, %0                             \n\t"            " jb 1b                             \n\t"        : "+r" (block), "+r" (sum), "+r" (offset)        : "r"(block+64)    );}#ifdef HAVE_SSSE3#define HAVE_SSSE3_BAK#endif#undef HAVE_SSSE3#undef HAVE_SSE2#undef HAVE_MMX2#define RENAME(a) a ## _MMX#define RENAMEl(a) a ## _mmx#include "mpegvideo_mmx_template.c"#define HAVE_MMX2#undef RENAME#undef RENAMEl#define RENAME(a) a ## _MMX2#define RENAMEl(a) a ## _mmx2#include "mpegvideo_mmx_template.c"#define HAVE_SSE2#undef RENAME#undef RENAMEl#define RENAME(a) a ## _SSE2#define RENAMEl(a) a ## _sse2#include "mpegvideo_mmx_template.c"#ifdef HAVE_SSSE3_BAK#define HAVE_SSSE3#undef RENAME#undef RENAMEl#define RENAME(a) a ## _SSSE3#define RENAMEl(a) a ## _sse2#include "mpegvideo_mmx_template.c"#endifvoid MPV_common_init_mmx(MpegEncContext *s){    if (mm_flags & MM_MMX) {        const int dct_algo = s->avctx->dct_algo;        s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_mmx;        s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx;        s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx;        s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx;        if(!(s->flags & CODEC_FLAG_BITEXACT))            s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx;        s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx;        draw_edges = draw_edges_mmx;        if (mm_flags & MM_SSE2) {            s->denoise_dct= denoise_dct_sse2;        } else {                s->denoise_dct= denoise_dct_mmx;        }        if(dct_algo==FF_DCT_AUTO || dct_algo==FF_DCT_MMX){#ifdef HAVE_SSSE3            if(mm_flags & MM_SSSE3){                s->dct_quantize= dct_quantize_SSSE3;            } else#endif            if(mm_flags & MM_SSE2){                s->dct_quantize= dct_quantize_SSE2;            } else if(mm_flags & MM_MMXEXT){                s->dct_quantize= dct_quantize_MMX2;            } else {                s->dct_quantize= dct_quantize_MMX;            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -