svq3: use hpeldsp instead of dsputil for half-pel functions.
[ffmpeg.git] / libavcodec / rectangle.h
index e138862..594a760 100644 (file)
  */
 
 /**
- * @file rectangle.h
+ * @file
  * useful rectangle filling function
  * @author Michael Niedermayer <michaelni@gmx.at>
  */
 
-#ifndef FFMPEG_RECTANGLE_H
-#define FFMPEG_RECTANGLE_H
+#ifndef AVCODEC_RECTANGLE_H
+#define AVCODEC_RECTANGLE_H
 
-#include "common.h"
+#include "config.h"
+#include "libavutil/common.h"
+#include "libavutil/avassert.h"
 
 /**
  * fill a rectangle.
  * @param h height of the rectangle, should be a constant
  * @param w width of the rectangle, should be a constant
- * @param size the size of val (1 or 4), should be a constant
+ * @param size the size of val (1, 2 or 4), should be a constant
  */
 static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){
     uint8_t *p= (uint8_t*)vp;
-    assert(size==1 || size==4);
-    assert(w<=4);
+    av_assert2(size==1 || size==2 || size==4);
+    av_assert2(w<=4);
 
     w      *= size;
     stride *= size;
 
-    assert((((long)vp)&(FFMIN(w, STRIDE_ALIGN)-1)) == 0);
-    assert((stride&(w-1))==0);
+    av_assert2((((long)vp)&(FFMIN(w, 8<<(HAVE_NEON|ARCH_PPC|HAVE_MMX))-1)) == 0);
+    av_assert2((stride&(w-1))==0);
     if(w==2){
         const uint16_t v= size==4 ? val : val*0x0101;
         *(uint16_t*)(p + 0*stride)= v;
@@ -55,7 +57,7 @@ static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride,
         *(uint16_t*)(p + 2*stride)= v;
         *(uint16_t*)(p + 3*stride)= v;
     }else if(w==4){
-        const uint32_t v= size==4 ? val : val*0x01010101;
+        const uint32_t v= size==4 ? val : size==2 ? val*0x00010001 : val*0x01010101;
         *(uint32_t*)(p + 0*stride)= v;
         if(h==1) return;
         *(uint32_t*)(p + 1*stride)= v;
@@ -64,8 +66,8 @@ static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride,
         *(uint32_t*)(p + 3*stride)= v;
     }else if(w==8){
     //gcc can't optimize 64bit math on x86_32
-#ifdef HAVE_FAST_64BIT
-        const uint64_t v= val*0x0100000001ULL;
+#if HAVE_FAST_64BIT
+        const uint64_t v=  size==2 ? val*0x0001000100010001ULL : val*0x0100000001ULL;
         *(uint64_t*)(p + 0*stride)= v;
         if(h==1) return;
         *(uint64_t*)(p + 1*stride)= v;
@@ -84,16 +86,17 @@ static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride,
         *(uint64_t*)(p + 0+3*stride)= v;
         *(uint64_t*)(p + 8+3*stride)= v;
 #else
-        *(uint32_t*)(p + 0+0*stride)= val;
-        *(uint32_t*)(p + 4+0*stride)= val;
+        const uint32_t v= size==2 ? val*0x00010001 : val;
+        *(uint32_t*)(p + 0+0*stride)= v;
+        *(uint32_t*)(p + 4+0*stride)= v;
         if(h==1) return;
-        *(uint32_t*)(p + 0+1*stride)= val;
-        *(uint32_t*)(p + 4+1*stride)= val;
+        *(uint32_t*)(p + 0+1*stride)= v;
+        *(uint32_t*)(p + 4+1*stride)= v;
         if(h==2) return;
-        *(uint32_t*)(p + 0+2*stride)= val;
-        *(uint32_t*)(p + 4+2*stride)= val;
-        *(uint32_t*)(p + 0+3*stride)= val;
-        *(uint32_t*)(p + 4+3*stride)= val;
+        *(uint32_t*)(p + 0+2*stride)= v;
+        *(uint32_t*)(p + 4+2*stride)= v;
+        *(uint32_t*)(p + 0+3*stride)= v;
+        *(uint32_t*)(p + 4+3*stride)= v;
     }else if(w==16){
         *(uint32_t*)(p + 0+0*stride)= val;
         *(uint32_t*)(p + 4+0*stride)= val;
@@ -114,8 +117,8 @@ static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride,
         *(uint32_t*)(p +12+3*stride)= val;
 #endif
     }else
-        assert(0);
-    assert(h==4);
+        av_assert2(0);
+    av_assert2(h==4);
 }
 
-#endif /* FFMPEG_RECTANGLE_H */
+#endif /* AVCODEC_RECTANGLE_H */