From 3d9fccbf0f49a9e522986aa182fe10399f999304 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 15 Jan 2002 04:07:29 +0000 Subject: [PATCH] (commit by michael) draw_edges_mmx() Originally committed as revision 266 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/i386/mpegvideo_mmx.c | 92 +++++++++++++++++++++++++++++++++ libavcodec/mpegvideo.c | 8 ++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/libavcodec/i386/mpegvideo_mmx.c b/libavcodec/i386/mpegvideo_mmx.c index f2fc528b0c..367fa7289b 100644 --- a/libavcodec/i386/mpegvideo_mmx.c +++ b/libavcodec/i386/mpegvideo_mmx.c @@ -24,6 +24,7 @@ #include "../mpegvideo.h" extern UINT8 zigzag_end[64]; +extern void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w); #if 0 @@ -322,6 +323,95 @@ asm volatile( } } +/* draw the edges of width 'w' of an image of size width, height + this mmx version can only handle w==8 || w==16 */ +static void draw_edges_mmx(UINT8 *buf, int wrap, int width, int height, int w) +{ + UINT8 *ptr, *last_line; + int i; + + last_line = buf + (height - 1) * wrap; + /* left and right */ + ptr = buf; + if(w==8) + { + 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 -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" + "addl %1, %0 \n\t" + "cmpl %3, %0 \n\t" + " jb 1b \n\t" + : "+r" (ptr) + : "r" (wrap), "r" (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" + "addl %1, %0 \n\t" + "cmpl %3, %0 \n\t" + " jb 1b \n\t" + : "+r" (ptr) + : "r" (wrap), "r" (width), "r" (ptr + wrap*height) + ); + } + + for(i=0;idct_unquantize = dct_unquantize_h263_mmx; else s->dct_unquantize = dct_unquantize_mpeg1_mmx; + + draw_edges = draw_edges_mmx; } } diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 1e3aff4f81..a338c78b5f 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -39,6 +39,10 @@ static int dct_quantize(MpegEncContext *s, DCTELEM *block, int n, int qscale); static int dct_quantize_mmx(MpegEncContext *s, DCTELEM *block, int n, int qscale); +static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w); + +void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c; + #define EDGE_WIDTH 16 /* enable all paranoid tests for rounding, overflows, etc... */ @@ -361,7 +365,7 @@ int MPV_encode_end(AVCodecContext *avctx) } /* draw the edges of width 'w' of an image of size width, height */ -static void draw_edges(UINT8 *buf, int wrap, int width, int height, int w) +static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w) { UINT8 *ptr, *last_line; int i; @@ -676,7 +680,7 @@ static inline void add_dct(MpegEncContext *s, { if (s->block_last_index[i] >= 0) { if (!s->mpeg2) - if(s->encoding || s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MSMPEG4) + if(s->encoding || (!s->h263_msmpeg4)) s->dct_unquantize(s, block, i, s->qscale); ff_idct (block); add_pixels_clamped(block, dest, line_size);