From fef3771778dbc9e7a17b7ce773f1b6d9651dff6f Mon Sep 17 00:00:00 2001 From: Aneesh Dogra Date: Sat, 28 Jan 2012 18:34:12 +0530 Subject: sunrast: Replace magic number by a macro. Signed-off-by: Aneesh Dogra Signed-off-by: Ronald S. Bultje --- libavcodec/sunrast.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index a471aee..b21c260 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -23,6 +23,8 @@ #include "libavutil/imgutils.h" #include "avcodec.h" +#define RAS_MAGIC 0x59a66a95 + /* The Old and Standard format types indicate that the image data is * uncompressed. There is no difference between the two formats. */ #define RT_OLD 0 @@ -74,7 +76,7 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, if (avpkt->size < 32) return AVERROR_INVALIDDATA; - if (AV_RB32(buf) != 0x59a66a95) { + if (AV_RB32(buf) != RAS_MAGIC) { av_log(avctx, AV_LOG_ERROR, "this is not sunras encoded data\n"); return -1; } -- cgit v1.1 From 4ffb8e2c14dbbe28014fb9d5cea769d600094e1b Mon Sep 17 00:00:00 2001 From: Aneesh Dogra Date: Sun, 29 Jan 2012 10:55:32 +0530 Subject: sunrast: Remove if (unsigned int < 0) check. Note: This fixes the following GCC warning :- libavcodec/sunrast.c:94: warning: comparison of unsigned expression < 0 is always false. Signed-off-by: Ronald S. Bultje --- libavcodec/sunrast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index b21c260..c7af1fd 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -93,7 +93,7 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, av_log(avctx, AV_LOG_ERROR, "unsupported (compression) type\n"); return -1; } - if (type < RT_OLD || type > RT_FORMAT_IFF) { + if (type > RT_FORMAT_IFF) { av_log(avctx, AV_LOG_ERROR, "invalid (compression) type\n"); return -1; } -- cgit v1.1 From 415f358a1f926878fc7bc31715cc6d221e372fa0 Mon Sep 17 00:00:00 2001 From: Aneesh Dogra Date: Sat, 28 Jan 2012 18:34:14 +0530 Subject: sunrast: Cosmetics Signed-off-by: Aneesh Dogra Signed-off-by: Ronald S. Bultje --- libavcodec/sunrast.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index c7af1fd..23f1e6f 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -57,18 +57,18 @@ static av_cold int sunrast_init(AVCodecContext *avctx) { SUNRASTContext *s = avctx->priv_data; avcodec_get_frame_defaults(&s->picture); - avctx->coded_frame= &s->picture; + avctx->coded_frame = &s->picture; return 0; } static int sunrast_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; - const uint8_t *buf_end = avpkt->data + avpkt->size; + const uint8_t *buf = avpkt->data; + const uint8_t *buf_end = avpkt->data + avpkt->size; SUNRASTContext * const s = avctx->priv_data; - AVFrame *picture = data; - AVFrame * const p = &s->picture; + AVFrame *picture = data; + AVFrame * const p = &s->picture; unsigned int w, h, depth, type, maptype, maplength, stride, x, y, len, alen; uint8_t *ptr; const uint8_t *bufstart = buf; @@ -81,12 +81,12 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, return -1; } - w = AV_RB32(buf+4); - h = AV_RB32(buf+8); - depth = AV_RB32(buf+12); - type = AV_RB32(buf+20); - maptype = AV_RB32(buf+24); - maplength = AV_RB32(buf+28); + w = AV_RB32(buf + 4); + h = AV_RB32(buf + 8); + depth = AV_RB32(buf + 12); + type = AV_RB32(buf + 20); + maptype = AV_RB32(buf + 24); + maplength = AV_RB32(buf + 28); buf += 32; if (type == RT_FORMAT_TIFF || type == RT_FORMAT_IFF || type == RT_EXPERIMENTAL) { @@ -153,8 +153,8 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, } ptr = p->data[1]; - for (x=0; x> 3; - alen = len + (len&1); + alen = len + (len & 1); if (type == RT_BYTE_ENCODED) { int value, run; - uint8_t *end = ptr + h*stride; + uint8_t *end = ptr + h * stride; x = 0; while (ptr != end && buf < buf_end) { @@ -193,7 +193,7 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, } } } else { - for (y=0; ypicture; + *picture = s->picture; *data_size = sizeof(AVFrame); return buf - bufstart; -- cgit v1.1 From f9708e9a0e76d3dfa89f175edde68d8cadb02763 Mon Sep 17 00:00:00 2001 From: Aneesh Dogra Date: Sat, 28 Jan 2012 18:34:15 +0530 Subject: sunrast: Add a sample request for TIFF, IFF, and Experimental Rastfile formats. Signed-off-by: Aneesh Dogra Signed-off-by: Ronald S. Bultje --- libavcodec/sunrast.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index 23f1e6f..601ba6e 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -90,8 +90,8 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, buf += 32; if (type == RT_FORMAT_TIFF || type == RT_FORMAT_IFF || type == RT_EXPERIMENTAL) { - av_log(avctx, AV_LOG_ERROR, "unsupported (compression) type\n"); - return -1; + av_log_ask_for_sample(avctx, "unsupported (compression) type\n"); + return AVERROR_PATCHWELCOME; } if (type > RT_FORMAT_IFF) { av_log(avctx, AV_LOG_ERROR, "invalid (compression) type\n"); -- cgit v1.1 From e92003514d7aab25d56e2d827820f47755d397ec Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Fri, 27 Jan 2012 23:00:36 +0800 Subject: png: move DSP functions to their own DSP context. --- libavcodec/Makefile | 2 +- libavcodec/dsputil.c | 16 ----- libavcodec/dsputil.h | 3 - libavcodec/pngdec.c | 10 ++-- libavcodec/pngdsp.c | 48 +++++++++++++++ libavcodec/pngdsp.h | 40 +++++++++++++ libavcodec/x86/Makefile | 1 + libavcodec/x86/dsputil_mmx.c | 102 -------------------------------- libavcodec/x86/pngdsp-init.c | 135 +++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 230 insertions(+), 127 deletions(-) create mode 100644 libavcodec/pngdsp.c create mode 100644 libavcodec/pngdsp.h create mode 100644 libavcodec/x86/pngdsp-init.c (limited to 'libavcodec') diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 27f8546..daf2ce3 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -296,7 +296,7 @@ OBJS-$(CONFIG_PGMYUV_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PGMYUV_ENCODER) += pnmenc.o pnm.o OBJS-$(CONFIG_PGSSUB_DECODER) += pgssubdec.o OBJS-$(CONFIG_PICTOR_DECODER) += pictordec.o cga_data.o -OBJS-$(CONFIG_PNG_DECODER) += png.o pngdec.o +OBJS-$(CONFIG_PNG_DECODER) += png.o pngdec.o pngdsp.o OBJS-$(CONFIG_PNG_ENCODER) += png.o pngenc.o OBJS-$(CONFIG_PPM_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 5c1039b..a7c69c0 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -38,7 +38,6 @@ #include "config.h" #include "ac3dec.h" #include "vorbis.h" -#include "png.h" uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, }; uint32_t ff_squareTbl[512] = {0, }; @@ -1882,17 +1881,6 @@ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){ dst[i+0] += src[i+0]; } -static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ - long i; - for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ - long a = *(long*)(src1+i); - long b = *(long*)(src2+i); - *(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80); - } - for(; issd_int8_vs_int16 = ssd_int8_vs_int16_c; c->add_bytes= add_bytes_c; - c->add_bytes_l2= add_bytes_l2_c; c->diff_bytes= diff_bytes_c; c->add_hfyu_median_prediction= add_hfyu_median_prediction_c; c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c; @@ -3011,9 +2998,6 @@ av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx) c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c; c->bswap_buf= bswap_buf; c->bswap16_buf = bswap16_buf; -#if CONFIG_PNG_DECODER - c->add_png_paeth_prediction= ff_add_png_paeth_prediction; -#endif if (CONFIG_H263_DECODER || CONFIG_H263_ENCODER) { c->h263_h_loop_filter= h263_h_loop_filter_c; diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index 3001609..579b54b 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -378,7 +378,6 @@ 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 @@ -388,8 +387,6 @@ typedef struct DSPContext { void (*add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top); int (*add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left); void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha); - /* 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 (*bswap16_buf)(uint16_t *dst, const uint16_t *src, int len); diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index a40cebb..801085b 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -22,7 +22,7 @@ #include "avcodec.h" #include "bytestream.h" #include "png.h" -#include "dsputil.h" +#include "pngdsp.h" /* TODO: * - add 2, 4 and 16 bit depth support @@ -33,7 +33,7 @@ //#define DEBUG typedef struct PNGDecContext { - DSPContext dsp; + PNGDSPContext dsp; const uint8_t *bytestream; const uint8_t *bytestream_start; @@ -191,7 +191,7 @@ void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w } /* NOTE: 'dst' can be equal to 'last' */ -static void png_filter_row(DSPContext *dsp, uint8_t *dst, int filter_type, +static void png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type, uint8_t *src, uint8_t *last, int size, int bpp) { int i, p, r, g, b, a; @@ -235,7 +235,7 @@ static void png_filter_row(DSPContext *dsp, uint8_t *dst, int filter_type, if(bpp > 1 && size > 4) { // would write off the end of the array if we let it process the last pixel with bpp=3 int w = bpp==4 ? size : size-3; - dsp->add_png_paeth_prediction(dst+i, src+i, last+i, w-i, bpp); + dsp->add_paeth_prediction(dst+i, src+i, last+i, w-i, bpp); i = w; } ff_add_png_paeth_prediction(dst+i, src+i, last+i, size-i, bpp); @@ -639,7 +639,7 @@ static av_cold int png_dec_init(AVCodecContext *avctx){ s->last_picture = &s->picture2; avcodec_get_frame_defaults(&s->picture1); avcodec_get_frame_defaults(&s->picture2); - dsputil_init(&s->dsp, avctx); + ff_pngdsp_init(&s->dsp); return 0; } diff --git a/libavcodec/pngdsp.c b/libavcodec/pngdsp.c new file mode 100644 index 0000000..d40bf9c --- /dev/null +++ b/libavcodec/pngdsp.c @@ -0,0 +1,48 @@ +/* + * PNG image format + * Copyright (c) 2008 Loren Merrit + * + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/common.h" +#include "png.h" +#include "pngdsp.h" + +// 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size +#define pb_7f (~0UL/255 * 0x7f) +#define pb_80 (~0UL/255 * 0x80) + +static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w) +{ + long i; + for (i = 0; i <= w - sizeof(long); i += sizeof(long)) { + long a = *(long *)(src1 + i); + long b = *(long *)(src2 + i); + *(long *)(dst + i) = ((a & pb_7f) + (b & pb_7f)) ^ ((a ^ b) & pb_80); + } + for (; i < w; i++) + dst[i] = src1[i] + src2[i]; +} + +void ff_pngdsp_init(PNGDSPContext *dsp) +{ + dsp->add_bytes_l2 = add_bytes_l2_c; + dsp->add_paeth_prediction = ff_add_png_paeth_prediction; + + if (HAVE_MMX) ff_pngdsp_init_x86(dsp); +} diff --git a/libavcodec/pngdsp.h b/libavcodec/pngdsp.h new file mode 100644 index 0000000..98d29a8 --- /dev/null +++ b/libavcodec/pngdsp.h @@ -0,0 +1,40 @@ +/* + * PNG image format + * Copyright (c) 2008 Loren Merrit + * + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_PNGDSP_H +#define AVCODEC_PNGDSP_H + +#include + +typedef struct PNGDSPContext { + void (*add_bytes_l2)(uint8_t *dst /* align 16 */, + uint8_t *src1 /* align 16 */, + uint8_t *src2 /* align 16 */, int w); + + /* this might write to dst[w] */ + void (*add_paeth_prediction)(uint8_t *dst, uint8_t *src, + uint8_t *top, int w, int bpp); +} PNGDSPContext; + +void ff_pngdsp_init(PNGDSPContext *dsp); +void ff_pngdsp_init_x86(PNGDSPContext *dsp); + +#endif /* AVCDODEC_PNGDSP_H */ diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index 1e88e4a..7b76aab 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -42,6 +42,7 @@ MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o YASM-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_yasm.o MMX-OBJS-$(CONFIG_GPL) += x86/idct_mmx.o MMX-OBJS-$(CONFIG_LPC) += x86/lpc_mmx.o +MMX-OBJS-$(CONFIG_PNG_DECODER) += x86/pngdsp-init.o YASM-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp.o MMX-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp-init.o MMX-OBJS-$(CONFIG_DWT) += x86/snowdsp_mmx.o diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index 7964014..7cc16c0 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -582,28 +582,6 @@ static void add_bytes_mmx(uint8_t *dst, uint8_t *src, int w){ dst[i+0] += src[i+0]; } -static void add_bytes_l2_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ - x86_reg i=0; - __asm__ volatile( - "jmp 2f \n\t" - "1: \n\t" - "movq (%2, %0), %%mm0 \n\t" - "movq 8(%2, %0), %%mm1 \n\t" - "paddb (%3, %0), %%mm0 \n\t" - "paddb 8(%3, %0), %%mm1 \n\t" - "movq %%mm0, (%1, %0) \n\t" - "movq %%mm1, 8(%1, %0) \n\t" - "add $16, %0 \n\t" - "2: \n\t" - "cmp %4, %0 \n\t" - " js 1b \n\t" - : "+r" (i) - : "r"(dst), "r"(src1), "r"(src2), "r"((x86_reg)w-15) - ); - for(; iadd_bytes= add_bytes_mmx; - c->add_bytes_l2= add_bytes_l2_mmx; if (!high_bit_depth) c->draw_edges = draw_edges_mmx; @@ -2686,8 +2589,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) if (HAVE_AMD3DNOW && (mm_flags & AV_CPU_FLAG_3DNOW)) c->add_hfyu_median_prediction = add_hfyu_median_prediction_cmov; #endif - - c->add_png_paeth_prediction= add_png_paeth_prediction_mmx2; } else if (HAVE_AMD3DNOW && (mm_flags & AV_CPU_FLAG_3DNOW)) { c->prefetch = prefetch_3dnow; @@ -2826,9 +2727,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) H264_QPEL_FUNCS_10(2, 0, ssse3_cache64) H264_QPEL_FUNCS_10(3, 0, ssse3_cache64) } -#endif - c->add_png_paeth_prediction= add_png_paeth_prediction_ssse3; -#if HAVE_YASM if (!high_bit_depth && CONFIG_H264CHROMA) { c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_ssse3_rnd; c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_ssse3_rnd; diff --git a/libavcodec/x86/pngdsp-init.c b/libavcodec/x86/pngdsp-init.c new file mode 100644 index 0000000..6545236 --- /dev/null +++ b/libavcodec/x86/pngdsp-init.c @@ -0,0 +1,135 @@ +/* + * x86 PNG optimizations. + * Copyright (c) 2008 Loren Merrit + * + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/cpu.h" +#include "libavutil/x86_cpu.h" +#include "libavcodec/pngdsp.h" +#include "dsputil_mmx.h" + +#define PAETH(cpu, abs3)\ +static void add_png_paeth_prediction_##cpu(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp)\ +{\ + x86_reg i = -bpp;\ + x86_reg end = w-3;\ + __asm__ volatile(\ + "pxor %%mm7, %%mm7 \n"\ + "movd (%1,%0), %%mm0 \n"\ + "movd (%2,%0), %%mm1 \n"\ + "punpcklbw %%mm7, %%mm0 \n"\ + "punpcklbw %%mm7, %%mm1 \n"\ + "add %4, %0 \n"\ + "1: \n"\ + "movq %%mm1, %%mm2 \n"\ + "movd (%2,%0), %%mm1 \n"\ + "movq %%mm2, %%mm3 \n"\ + "punpcklbw %%mm7, %%mm1 \n"\ + "movq %%mm2, %%mm4 \n"\ + "psubw %%mm1, %%mm3 \n"\ + "psubw %%mm0, %%mm4 \n"\ + "movq %%mm3, %%mm5 \n"\ + "paddw %%mm4, %%mm5 \n"\ + abs3\ + "movq %%mm4, %%mm6 \n"\ + "pminsw %%mm5, %%mm6 \n"\ + "pcmpgtw %%mm6, %%mm3 \n"\ + "pcmpgtw %%mm5, %%mm4 \n"\ + "movq %%mm4, %%mm6 \n"\ + "pand %%mm3, %%mm4 \n"\ + "pandn %%mm3, %%mm6 \n"\ + "pandn %%mm0, %%mm3 \n"\ + "movd (%3,%0), %%mm0 \n"\ + "pand %%mm1, %%mm6 \n"\ + "pand %%mm4, %%mm2 \n"\ + "punpcklbw %%mm7, %%mm0 \n"\ + "movq %6, %%mm5 \n"\ + "paddw %%mm6, %%mm0 \n"\ + "paddw %%mm2, %%mm3 \n"\ + "paddw %%mm3, %%mm0 \n"\ + "pand %%mm5, %%mm0 \n"\ + "movq %%mm0, %%mm3 \n"\ + "packuswb %%mm3, %%mm3 \n"\ + "movd %%mm3, (%1,%0) \n"\ + "add %4, %0 \n"\ + "cmp %5, %0 \n"\ + "jle 1b \n"\ + :"+r"(i)\ + :"r"(dst), "r"(top), "r"(src), "r"((x86_reg)bpp), "g"(end),\ + "m"(ff_pw_255)\ + :"memory"\ + );\ +} + +#define ABS3_MMX2\ + "psubw %%mm5, %%mm7 \n"\ + "pmaxsw %%mm7, %%mm5 \n"\ + "pxor %%mm6, %%mm6 \n"\ + "pxor %%mm7, %%mm7 \n"\ + "psubw %%mm3, %%mm6 \n"\ + "psubw %%mm4, %%mm7 \n"\ + "pmaxsw %%mm6, %%mm3 \n"\ + "pmaxsw %%mm7, %%mm4 \n"\ + "pxor %%mm7, %%mm7 \n" + +#define ABS3_SSSE3\ + "pabsw %%mm3, %%mm3 \n"\ + "pabsw %%mm4, %%mm4 \n"\ + "pabsw %%mm5, %%mm5 \n" + +PAETH(mmx2, ABS3_MMX2) +#if HAVE_SSSE3 +PAETH(ssse3, ABS3_SSSE3) +#endif + +static void add_bytes_l2_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w) +{ + x86_reg i=0; + + __asm__ volatile( + "jmp 2f \n\t" + "1: \n\t" + "movq (%2, %0), %%mm0 \n\t" + "movq 8(%2, %0), %%mm1 \n\t" + "paddb (%3, %0), %%mm0 \n\t" + "paddb 8(%3, %0), %%mm1 \n\t" + "movq %%mm0, (%1, %0) \n\t" + "movq %%mm1, 8(%1, %0) \n\t" + "add $16, %0 \n\t" + "2: \n\t" + "cmp %4, %0 \n\t" + " js 1b \n\t" + : "+r" (i) + : "r"(dst), "r"(src1), "r"(src2), "r"((x86_reg) w - 15) + ); + for (; i < w; i++) + dst[i] = src1[i] + src2[i]; +} + +void ff_pngdsp_init_x86(PNGDSPContext *dsp) +{ + int flags = av_get_cpu_flags(); + + if (flags & AV_CPU_FLAG_MMX) + dsp->add_bytes_l2 = add_bytes_l2_mmx; + if (flags & AV_CPU_FLAG_MMX2) + dsp->add_paeth_prediction = add_png_paeth_prediction_mmx2; + if (flags & AV_CPU_FLAG_SSSE3) + dsp->add_paeth_prediction = add_png_paeth_prediction_ssse3; +} -- cgit v1.1 From 331e7c4cb34eb77451fbf84c604d717ed49abf15 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sun, 29 Jan 2012 08:14:05 -0800 Subject: imdct36: mark SSE functions as using all 16 XMM registers. On x86-64, it indeed uses all 16 registers (and on x86-32, this gets clipped to 8). Not marking it properly causes callers of this function to fail randomly because of XMM register clobbering. --- libavcodec/x86/imdct36_sse.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/x86/imdct36_sse.asm b/libavcodec/x86/imdct36_sse.asm index abdd3af..937a2cc 100644 --- a/libavcodec/x86/imdct36_sse.asm +++ b/libavcodec/x86/imdct36_sse.asm @@ -391,7 +391,7 @@ INIT_XMM sse %endif %macro DEFINE_FOUR_IMDCT 0 -cglobal four_imdct36_float, 5,5,8, out, buf, in, win, tmp +cglobal four_imdct36_float, 5,5,16, out, buf, in, win, tmp movlps m0, [inq+64] movhps m0, [inq+64 + 72] movlps m3, [inq+64 + 2*72] -- cgit v1.1 From 20a7d3178f2370ebd1f548c144bc90d1e1bcd81a Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sun, 29 Jan 2012 12:31:59 -0800 Subject: png: add missing #if HAVE_SSSE3 around function pointer assignment. --- libavcodec/x86/pngdsp-init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/x86/pngdsp-init.c b/libavcodec/x86/pngdsp-init.c index 6545236..dfae9b3 100644 --- a/libavcodec/x86/pngdsp-init.c +++ b/libavcodec/x86/pngdsp-init.c @@ -130,6 +130,6 @@ void ff_pngdsp_init_x86(PNGDSPContext *dsp) dsp->add_bytes_l2 = add_bytes_l2_mmx; if (flags & AV_CPU_FLAG_MMX2) dsp->add_paeth_prediction = add_png_paeth_prediction_mmx2; - if (flags & AV_CPU_FLAG_SSSE3) + if (HAVE_SSSE3 && flags & AV_CPU_FLAG_SSSE3) dsp->add_paeth_prediction = add_png_paeth_prediction_ssse3; } -- cgit v1.1