Mercurial > libavcodec.hg
changeset 206:994aa8623443 libavcodec
(commit by michael)
draw_edges_mmx()
author | arpi_esp |
---|---|
date | Tue, 15 Jan 2002 04:07:29 +0000 |
parents | ccf36af385f3 |
children | 6954f2830e4a |
files | i386/mpegvideo_mmx.c mpegvideo.c |
diffstat | 2 files changed, 98 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/i386/mpegvideo_mmx.c Mon Jan 14 04:39:59 2002 +0000 +++ b/i386/mpegvideo_mmx.c Tue Jan 15 04:07:29 2002 +0000 @@ -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 @@ } } +/* 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;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" + "addl $8, %0 \n\t" + "cmpl %4, %0 \n\t" + " jb 1b \n\t" + : "+r" (ptr) + : "r" ((int)buf - (int)ptr - w), "r" (-wrap), "r" (-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" + "addl $8, %0 \n\t" + "cmpl %4, %0 \n\t" + " jb 1b \n\t" + : "+r" (ptr) + : "r" ((int)last_line - (int)ptr - w), "r" (wrap), "r" (wrap*3), "r" (ptr+width+2*w) + ); + } +} + + void MPV_common_init_mmx(MpegEncContext *s) { if (mm_flags & MM_MMX) { @@ -329,5 +419,7 @@ s->dct_unquantize = dct_unquantize_h263_mmx; else s->dct_unquantize = dct_unquantize_mpeg1_mmx; + + draw_edges = draw_edges_mmx; } }
--- a/mpegvideo.c Mon Jan 14 04:39:59 2002 +0000 +++ b/mpegvideo.c Tue Jan 15 04:07:29 2002 +0000 @@ -39,6 +39,10 @@ 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 @@ } /* 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 @@ { 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);