diff --git a/Makefile b/Makefile index 90dbbd247f..fcb7e5501b 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ PROGS-$(CONFIG_FFSERVER) += ffserver PROGS := $(PROGS-yes:%=%$(PROGSSUF)$(EXESUF)) INSTPROGS = $(PROGS-yes:%=%$(PROGSSUF)$(EXESUF)) + OBJS = cmdutils.o $(EXEOBJS) OBJS-ffmpeg = ffmpeg_opt.o ffmpeg_filter.o TESTTOOLS = audiogen videogen rotozoom tiny_psnr base64 diff --git a/common.mak b/common.mak index 751085d86e..0c48484e0e 100644 --- a/common.mak +++ b/common.mak @@ -56,6 +56,9 @@ COMPILE_S = $(call COMPILE,AS) %.o: %.S $(COMPILE_S) +%.i: %.c + $(CC) $(CCFLAGS) $(CC_E) $< + %.h.c: $(Q)echo '#include "$*.h"' >$@ diff --git a/configure b/configure index 28df15ea20..b5693ed449 100755 --- a/configure +++ b/configure @@ -4243,6 +4243,7 @@ ASFLAGS=$ASFLAGS AS_C=$AS_C AS_O=$AS_O CC_C=$CC_C +CC_E=$CC_E CC_O=$CC_O CXX_C=$CXX_C CXX_O=$CXX_O diff --git a/libavcodec/mpegvideo_motion.c b/libavcodec/mpegvideo_motion.c index 261fc1c405..18e6428888 100644 --- a/libavcodec/mpegvideo_motion.c +++ b/libavcodec/mpegvideo_motion.c @@ -178,20 +178,19 @@ static inline int hpel_motion(MpegEncContext *s, op_pixels_func *pix_op, int motion_x, int motion_y) { - int dxy; + int dxy = 0; int emu=0; - dxy = ((motion_y & 1) << 1) | (motion_x & 1); src_x += motion_x >> 1; src_y += motion_y >> 1; /* WARNING: do no forget half pels */ src_x = av_clip(src_x, -16, s->width); //FIXME unneeded for emu? - if (src_x == s->width) - dxy &= ~1; + if (src_x != s->width) + dxy |= motion_x & 1; src_y = av_clip(src_y, -16, s->height); - if (src_y == s->height) - dxy &= ~2; + if (src_y != s->height) + dxy |= (motion_y & 1) << 1; src += src_y * s->linesize + src_x; if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){ diff --git a/libavutil/mem.c b/libavutil/mem.c index f3853b0827..d73cddefd0 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -246,29 +246,93 @@ void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem) *nb_ptr = nb; } +static void fill16(uint8_t *dst, int len) +{ + uint32_t v = AV_RN16(dst - 2); + + v |= v << 16; + + while (len >= 4) { + AV_WN32(dst, v); + dst += 4; + len -= 4; + } + + while (len--) { + *dst = dst[-2]; + dst++; + } +} + +static void fill24(uint8_t *dst, int len) +{ +#if HAVE_BIGENDIAN + uint32_t v = AV_RB24(dst - 3); + uint32_t a = v << 8 | v >> 16; + uint32_t b = v << 16 | v >> 8; + uint32_t c = v << 24 | v; +#else + uint32_t v = AV_RL24(dst - 3); + uint32_t a = v | v << 24; + uint32_t b = v >> 8 | v << 16; + uint32_t c = v >> 16 | v << 8; +#endif + + while (len >= 12) { + AV_WN32(dst, a); + AV_WN32(dst + 4, b); + AV_WN32(dst + 8, c); + dst += 12; + len -= 12; + } + + if (len >= 4) { + AV_WN32(dst, a); + dst += 4; + len -= 4; + } + + if (len >= 4) { + AV_WN32(dst, b); + dst += 4; + len -= 4; + } + + while (len--) { + *dst = dst[-3]; + dst++; + } +} + +static void fill32(uint8_t *dst, int len) +{ + uint32_t v = AV_RN32(dst - 4); + + while (len >= 4) { + AV_WN32(dst, v); + dst += 4; + len -= 4; + } + + while (len--) { + *dst = dst[-4]; + dst++; + } +} + void av_memcpy_backptr(uint8_t *dst, int back, int cnt) { const uint8_t *src = &dst[-back]; if (back <= 1) { memset(dst, *src, cnt); + } else if (back == 2) { + fill16(dst, cnt); + } else if (back == 3) { + fill24(dst, cnt); + } else if (back == 4) { + fill32(dst, cnt); } else { - if (cnt >= 4) { - AV_COPY16U(dst, src); - AV_COPY16U(dst + 2, src + 2); - src += 4; - dst += 4; - cnt -= 4; - } - if (cnt >= 8) { - AV_COPY16U(dst, src); - AV_COPY16U(dst + 2, src + 2); - AV_COPY16U(dst + 4, src + 4); - AV_COPY16U(dst + 6, src + 6); - src += 8; - dst += 8; - cnt -= 8; - } - if (cnt > 0) { + if (cnt >= 16) { int blocklen = back; while (cnt > blocklen) { memcpy(dst, src, blocklen); @@ -277,7 +341,29 @@ void av_memcpy_backptr(uint8_t *dst, int back, int cnt) blocklen <<= 1; } memcpy(dst, src, cnt); + return; } + if (cnt >= 8) { + AV_COPY32U(dst, src); + AV_COPY32U(dst + 4, src + 4); + src += 8; + dst += 8; + cnt -= 8; + } + if (cnt >= 4) { + AV_COPY32U(dst, src); + src += 4; + dst += 4; + cnt -= 4; + } + if (cnt >= 2) { + AV_COPY16U(dst, src); + src += 2; + dst += 2; + cnt -= 2; + } + if (cnt) + *dst = *src; } } diff --git a/library.mak b/library.mak index 809d629d10..470795c23b 100644 --- a/library.mak +++ b/library.mak @@ -17,12 +17,19 @@ $(SUBDIR)%-test.o: $(SUBDIR)%-test.c $(SUBDIR)%-test.o: $(SUBDIR)%.c $(COMPILE_C) +$(SUBDIR)%-test.i: $(SUBDIR)%-test.c + $(CC) $(CCFLAGS) $(CC_E) $< + +$(SUBDIR)%-test.i: $(SUBDIR)%.c + $(CC) $(CCFLAGS) $(CC_E) $< + $(SUBDIR)x86/%.o: $(SUBDIR)x86/%.asm $(DEPYASM) $(YASMFLAGS) -I $( $(@:.o=.d) $(YASM) $(YASMFLAGS) -I $(